[TOC] 更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlhtml
因为k近邻能够作回归又能够作分类,因此最普通的k近邻算法在scikit-learn库中有两种实现,即KNeighborsClassifier和KNeighborsRegressor;上次讲到了k近邻的两个扩展限定半径k近邻,所以该方法在scikit-learn中也有两种实现,即RadiusNeighborsClassifier和RadiusNeighborsRegressor;k近邻还有一种扩展,即最近质心分类算法NearestCentroid。python
接下来将会讨论这五者的区别,因为是从官方文档翻译而来,翻译会略有偏颇,有兴趣的也能够去scikit-learn官方文档查看https://scikit-learn.org/stable/modules/classes.html#module-sklearn.neighbors算法
KNeighborsClassfier
模型就是最普通的k近邻算法,能够经过参数控制使用高斯距离、kd树、球树找到实例的$k$个近邻。数据结构
from sklearn.neighbors import KNeighborsClassifier X = [[0], [1], [2], [3]] y = [0, 0, 1, 1]
neigh = KNeighborsClassifier(n_neighbors=3) neigh.fit(X, y)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=None, n_neighbors=3, p=2, weights='uniform')
print(neigh.predict([[1.1]]))
[0]
print(neigh.predict_proba([[0.9]]))
[[0.66666667 0.33333333]]
找到某个点的n_neighbors个近邻。机器学习
# 为方便测试接下来的方法测试咱们将经过最近邻模型演示 samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]] from sklearn.neighbors import NearestNeighbors
neigh = NearestNeighbors(n_neighbors=1) neigh.fit(samples)
NearestNeighbors(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=None, n_neighbors=1, p=2, radius=1.0)
print(neigh.kneighbors([[1., 1., 1.]]))
(array([[0.5]]), array([[2]]))
X = [[0., 1., 0.], [1., 0., 1.]] neigh.kneighbors(X, return_distance=False)
array([[1], [2]])
计算样本X的n_neighbors个近邻的权重,能够返回距离或者矩阵关系图。ide
X = [[0], [3], [1]] from sklearn.neighbors import NearestNeighbors neigh = NearestNeighbors(n_neighbors=2) neigh.fit(X) A = neigh.kneighbors_graph(X) A.toarray()
array([[1., 0., 1.], [0., 1., 1.], [1., 0., 1.]])
KNeighborsRegressor
模型相似于KNeighborsClassifier
模型,不一样的是两个模型找到$k$个近邻的时候KNeighborsClassifier
模型使用了多数表决发选择类别,而KNeighborsRegressor
模型使用了对$k$近邻去平均数或者中位数的方法获得预测值。函数
RadiusNeighborsClassifier
模型相似KNeighborsClassifier
模型,不一样之处在于RadiusNeighborsClassifier
模型少了两个参数n_neighbors和n_jobs,多了两个参数:学习
RadiusNeighborsRegressor
模型相似于RadiusNeighborsRegressor
模型,不一样之处在于少了参数outlier_label,而且二者在获得$k$个近邻后处理的方式不一样。测试
NearestCentroid
模型是基于最近质心分类算法实现的,因为只有metric距离度量参数和shrink_threshold特征距离阈值两个参数,很少赘述。网站