【机器学习】使用Scikit-Learn库实现K-近邻(KNN)算法

懒惰学习算法的典型例子。

KNN仅仅对训练集有记忆功能不会从其他训练集中通过学习得到一个判别函数

 

参数化模型和非参数化模型:

1、       参数化模型,通过训练数据估计参数:感知机、逻辑回归、线性SVM

2、       非参数化模型,无法通过固定参数来进行表征,参数数量随训练数据的增加而递增:SVM、决策树、KNN

 

KNN基于实例的学习,只对训练数据产生记忆,学习阶段的计算成本基本为0

 

KNN的实现过程:

1、       选择近邻数量k和距离高度量方法

2、       找到待分类样本的k个最近邻居

3、       根据最近邻居的类标进行多数投票


KNN图:



KNN基于选定的距离度量标准从训练数据集中找到与待预测目标点的k个距离最近(相似)的样本

目标点的类标基于这k个最近的近邻的类标使用多数投票确定。

 

优点:分类器可以快速的适应新的训练数据

缺点:最坏情况下,复杂度随样本的数量的增多而呈线性增长

 

对于KNN来说,找到正确的k值是在欠拟合和过拟合中找到平衡点的关键所在。

必须保证所选的距离度量标准适用于数据集中的特征。

 

使用闵可夫斯基距离是对欧几里得距离及曼哈顿距离的一种泛化。

维度灾难:使得KNN算法易于过拟合,对于一个样本数量大小稳定的训练数据集,随着其特征数量的增加,样本中有具体的特征数量变得极其稀疏,也就是近邻距离过远。

 

本文使用的数据集库文件定义在该章节有定义了,链接:http://mp.blog.csdn.net/postedit/79196206

实现代码:

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=5, p=2, metric='minkowski')
knn.fit(X_train_std, y_train)

plot_decision_regions(X_combined_std, y_combined, 
                      classifier=knn, test_idx=range(105,150))

plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()
# plt.savefig('./figures/k_nearest_neighbors.png', dpi=300)
plt.show()




猜你喜欢

转载自blog.csdn.net/chenvast/article/details/79202283