1.算法原理
K近邻算法,也就是KNN,监督学习的一种。即给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居)(投票,票数多的当选), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。K通常是不大于20的整数。
KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
2. 代码实例
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
iris = datasets.load_iris()
iris_X = iris.data
iris_Y = iris.target
X_train, X_test, Y_train, Y_test = train_test_split(iris_X, iris_Y, test_size=0.3)
print(Y_train)
knn = KNeighborsClassifier()
knn.fit(X_train, Y_train)
Y_predict = knn.predict(X_test)
print(Y_predict)
参数信息
class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30,
p=2, metric=’minkowski’,metric_params=None, n_jobs=None, **kwargs)
n_neighbors: int,默认值为5,表示k-nn算法中选取离测试数据最近的k个点。
weight: str or callable,默认值为uniform
表示k近邻点都分类结果的影响,一般的情况下是选取k近邻点中类别数目最多的作为分类结果,这种情况下默认k个点的权重相等,但在很多情况下,k近邻点权重并不相等,可能近的点权重大,对分类结果影响大。
默认值为uniform,还可以是distance和自定义函数。
‘uniform’:表示所有点的权重相等
‘distance’:表示权重是距离的倒数,意味着k个点中距离近的点对分类结果的影响大于距离远的点
[callable]:用户自定义函数,接受一个距离数组,返回一个同维度的权重数。
algorithm:{‘ball_tree’,‘kd_tree’,‘brute’,‘auto’} , 计算找出k近邻点的算法
‘ball_tree’:使用BallTree维数大于20时建议使用
‘kd_tree’:使用KDTree,原理是数据结构的二叉树,以中值为划分,每个节点是一个超矩形,在维数小于20是效率高
‘brute’:暴力算法,线性扫描
‘auto’:自动选取最合适的算法
(note:在稀疏的输入数据上拟合,将使用’brute’覆盖此参数。)
leaf_size:int,默认值为30
用于构造 BallTree 和 KDTree,leaf_size参数设置会影响树构造的树构造和询问的速度,同样也会影响树存储需要的内存,这个值的设定取决于问题本身。
p:int,默认值为2
1:使用曼哈顿距离进行度量
2:使用欧式距离进行度量
metric : string or callable, 默认使用’minkowski’(闵可夫斯基距离),度量函数
其中p是一个变参数,也就是上一个介绍的参数p
当p=1时,就是曼哈顿距离
当p=2时,就是欧氏距离
当p→∞时,就是切比学夫距离
metric_params : dict, 默认为None
度量函数的其他关键参数,一般不用设置
n_jobs : int or None, 默认None
用于搜索k近邻点并行任务数量,-1表示任务数量设置为CPU的核心数,即CPU的所有core都并行工作,不会影响fit(拟合)函数。
3. 其他变种
knn算法有一些变种,其中之一是可以增加邻居的权重。默认情况下,在计算距离时,都是使用相同权重。实际上,可以针对不同的邻居指定不同的距离权重,如距离越近权重越高。这个可以通过指定算法的weights参数来实现。
另一个变种是,使用一定半径内的点取代距离最近的k个点。当数据采样不均匀时,可以有更好的性能。在scikit-learn里,RadiusNeighborsClassifier {RadiusNeighborsClassifier}RadiusNeighborsClassifier类实现了这个算法变种。
参考别人的。
原文链接:https://blog.csdn.net/kun_csdn/article/details/88919091