机器学习算法之KNN
KNN 算法的基本理论:
KNN(k-nearest neighbor)算法也叫K近邻,是一种既可以用于回归又可以分类的机器学习算法。k-近邻算法就是采用测量不同特征值之间的距离(一般选取欧氏距离作为度量)进行分类的方法。它的思路是:如果一个样本在特征空间中的k个最相似(邻近)的样本中大多数属于一个类别,则该样本也属于这个类别。在K-近邻算法当中,所选择的邻近点都已经是正确分类的对象。我们只依据k个(通常不大于20)邻近样本的类别来决定待分样本的类别。
KNN算法的使用流程
1. 收集数据
2. 计算待测数据与训练数据之间的距离(一般采用欧式距离)
3. 将计算的距离排序
4. 找出距离最小的k个值
5. 计算找出值中每个类别的频次
6. 返回最高频次的类别
欧式距离:
欧式距离也称欧里几德度量,在二维和三维空间中的欧氏距离就是两点之间的实际距离。
计算公式:
对于计算公式,其实我们在中学数学课上学两点之间的距离就是一个二维空间上的欧式距离。在三维空间上,还是同样的原理只是增加一个维度,相应的计算公式也多了一个平方。
图解KNN算法
KNN算法反应一个哲学道理,也就是我们常说的“近朱者赤近墨者黑的道理“。将它归纳为和它具有相识度最大的为一类。这里的相似度用欧氏距离来表示,找最小的K的距离选出出现频率的样本的标签来代替要预测样本的标签。
使用scikit-learn三方库完成KNN
前期准备:pip install scikit-learn,安装机器学习支持的三方库
数据集使用scklearn.datasets自带鸢尾花数据,鸢尾花数据集内包括3类鸢尾,包括山鸢尾、变色鸢尾和维吉尼亚鸢尾,每个记录都有4个特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度。
数据集的导入与分析:
from sklearn.datasets import load_iris
# 用于划分数据集
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
# 加载数据集
dataset = load_iris()
# 划分数据
X_train, X_test, y_train, y_test = train_test_split(dataset['data'],dataset['target'],random_state= 0)
# random_state的作用相当于随机种子,是为了保证每次分割的训练集和测试集都是一样的
# 设置邻居数,即n_neighbors的大小
knn = KNeighborsClassifier(n_neighbors = 5)
# 构建模型
knn.fit(X_train,y_train)
# 得出分数
print("score:{:.2f}".format(knn.score(X_test,y_test)))
# 尝试一条测试数据
X_try = np.array([[5,4,1,0.7]])
# 对X_try预测结果
prediction = knn.predict(X_try)
print("prediction = ",prediction)
kNN算法的有缺点
优点:精度高、对异常值不敏感
缺点:计算复杂度高、空间复杂度高、K值需要根据经验来指定
总结
KNN算法是机器学习中最容易理解也是最简单的算法,KNN算法对小样本比较友好。KNN算法既可以做回归也可以做分类问题,可以结合实际数据和要预测的数据类型来做出合适的选择。