【机器学习】算法入门——KNN k—最邻近算法
摘要:KNN分类算法,是理论上比较成熟的方法,也是最简单的机器学习算法之一。该算法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
简单的描述该算法的思想其实就是某个样本在特征空间中与其距离最近的k个样本中同一类样本最多的样本类同属于同一个样本类别。
KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
由下面的图可以更直观的分析knn邻近算法当k=3的时候,在最小的圆圈内可以看见与其距离最近的三个图形中有两个都是红色三角形类,所以样本的类别应该和红色三角形的类别属于同一类。
下面是在Jupyter Notebook上对该算法简单实现
import numpy as np
import matplotlib.pyplot as plt //matplotlib可视化库的子模块,用于后面做数据可视化
raw_data_x = [[3.39,2.33],
[3.11,1.78],
[1.34,3.37],
[3.58,4.68],
[2.28,2.87],
[7.42,4.70],
[5.75,3.53],
[9.17,2.51],
[7.79,3.42],
[7.93,0.79]]//自定义的十个样本量,对应raw_data_y数组中的值,0代表错误,1代表正确
raw_data_y = [0,0,0,0,0,1,1,1,1,1]
x_train = np.array(raw_data_x)
y_train = np.array(raw_data_y)//分别赋值给x_train、y_train两个numpy数组
//下面做数据可视化处理
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='g')
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='r')
plt.show()//对应结果为错误的数据显示为绿色的点,正确的点表示为红色的点
x = np.array([1.0966666,3.3654548848])//测试样本
//以下数据可视化结果可以看到的是样本和原数据的分布图
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='g')
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='r')
plt.scatter(x[0],x[1],color='b')
plt.show()
//下面是knn过程
from math import sqrt
distances = []
for xtrain in x_train:
d =sqrt(np.sum((xtrain-x)**2))//计算样本点与原来图的所有距离值,
并且将结果保存在distances数组之中。
distances.append(d)
nearest = np.argsort(distances) //将计算出来的距离由小到大进行排列并使用arg的方法获得对应原数组的下标数组
k = 6 //给定k值
topK_y = [y_train[i] for i in nearest[:k]]//将对应的六个临近k值对应的确定值依次放在topK_y数组之中
from collections import Counter
votes = Counter(topK_y)//调用collections中的Counter方法计算呀topK_y数组中的统计结果
predict = votes.most_common(1)[0][0]//调用most_common方法来取出votes中的预测值。
下图是最终预测结果,通过可视化的二维分布图也可以清楚的判定结果为0.
以下是测试样本和原数据的可视化结果可以直观的发现,测试样本的knn算法结果应该是0.