机器学习快速入门篇
kNN-k近邻算法
- 思想极度简单
- 应用数学知识少(近乎为零)
- 效果好
- 可以解释机器学习算法使用过程中的很多细节问题
- 更完整的刻画机器学习应用的流程
kNN算法概述
kNN(k-Nearest Neighbors)是机器学习中典型的有监督学习中的分类算法,这种分类算法极其简单。其原理大致是这样子,正所谓近朱者赤近墨者黑,kNN算法是通过距离对特征的判断,并把要预测的数据分类到与其特征距离最近的数据中去。而如何去寻找距离则是kNN算法的灵魂所在。我将会在下面的学习中为大家介绍如何寻找距离。
实例教程:
图中是两个特征的在二维坐标中的分布,其中A类我们就用蓝颜色的点表示,B类我们就用红颜色的点表示,假如这时我们插入要预测的数据,仅仅知道要预测的数据的特征值,但是并不知道其属于A类还是B类。在预测前,我们先取一个k值,我们令k = 6,至于k值如何取,我将会在下面的学习中介绍给大家。我们在二维坐标上绘制要预测的数据,颜色为绿色,如下图:
从图中我们可以分直接的观看到绿颜色的点离蓝颜色的点较近。而kNN算法要做的事情是,在绿色点的周围取距离绿色点最近的k个点,并在这k个点中进行投票决定它是属于A类还是B类,很明显,距离绿色最近的k个点中,蓝色票数为5,而红色票数为1,因此,我们判断要预测的点属于A类。实现过程如下:
首先我们导入我们所需要的包(也就是我们所需要用到的函数)
import numpy as np
from math import sqrt
from collections import Counter
其次我们获取数据,这里的数据是我随机设定的。
raw_data_x = np.array([[42.48132431, 53.49407197],
[45.8494149 , 46.00393994],
[53.47615045, 54.94134 ],
[50.93246162, 57.77594758],
[42.40088275, 47.70410918],
[33.02704954, 27.9444391 ],
[25.87726861, 37.08031903],
[30.11482033, 25.38937418],
[34.46997883, 31.33178384],
[29.72187197, 25.27058888]])
这里我们将A类用1表示,B类用0表示。并将raw_data_x对应的类型存入一个数组中
raw_data_y = [0,0,0,0,0,1,1,1,1,1]
现在我们定义要预测的数据,并求出他与raw_data_x中每一个距离,并将这些距离放入数组中,这里的距离我们使用的是欧拉距离。公式如下:
D i s t a n c e = ∑ i = 1 m ( x i ( a ) ) − ( x i ( b ) ) 2 Distance = \sqrt{\sum\limits_{i=1}^{m}(x^{(a)}_i) - (x^{(b)}_i) ^2} Distance=i=1∑m(xi(a))−(xi(b))2
x = np.array([30.554891,35.546849])
distance = []
for X_train in x_train:
d = sqrt(np.sum((x-X_train)**2))
distance.append(d)
最后,我们将这个距离数组调用numpy中argsort这个函数,这个函数返回的也是一个数组,但存放的是距离数组排序后的索引,至于numpy的用法我就不详细介绍了,这是numpy基础教程,想了解的可以点击此处然后我们在raw_data_y这个数组中根据存放是距离数组排序后的索引的数组获取前k个值。并将这k个值对应的个数表示出来,这里我们使用的是collections中的Counter这个函数。
nearest = np.argsort(distance)
topK_y = [y_train[i] for i in nearest[:k]]
Counter(topK_y)
输出:Counter({0: 1, 1: 5})
通过Counter可以看出,在距离预测数据x最近的k个点中,有五个为1,一个为0,即五个是A类,一个是B类。最后我们获取要预测的数据类型。
y_predict = votes.most_common(1)[0][0]
y_predict
输出:1
我们也可以使用scikit-learn中的kNN
大致实现如下:
from sklearn.neighbors import KNeighborsClassifier
kNN_classifier = KNeighborsClassifier(n_neighbors = 6)
kNN_classifier.fit(x_train,y_train)
x = x.reshape(1,-1)
y_predict = kNN_classifier.predict(x)
y_predict
输出:array([1])