【机器学习】KNN —k近邻算法的学习
算法介绍
这个算法适合机器学习初学者的算法,基本没有任何的数学知识,在机器学习中有很好地效果,能够解释很多机器学习中的问题,更完整的刻画机器学习的算法应用,同样也有很多缺点。
如图,当新的数据来到时,将数新的数据与原有数据进行比较,选取其最近的K 个原有数据来进行比较,通过比较的结果来判断该点的分类情况。该算法首先能解决的就是监督学习中的分类问题,当然回归问题也可得到解决。
举例
在这里的数据集是根据学习视频里编写的假的数据集,具体思路根据代码中的注释来观察。
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
raw_data_X = [ [3.393533211,2.331273381 ],
[3.110073483,1.781539638],
[1.343808831,3.368360954],
[3.582294042,4.679179110],
[2.280362439,2.866990263],
[7.423436942,4.696522875],
[5.745051997,3.533989803],
[9.172168622,2.511101045],
[7.792783481,3.424088941],
[7.939820817,0.791637231] ]
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)#将xy传入训练集即可
#这是新来的数据
s = np.array([5.425516942,3.6456522875])
#初学者这里的横纵左边很难理解,上次的介绍中有这部分知识,可以当做参考。
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(s[0],s[1],color="y")
plt.show()
KNN的过程
- 首先要计算距离(寻找最近的数据点)
这里的公式距离公式从很简单,只是两点距离公式,多个数据之间的距离。
- 这里生成表达式也可以用下列循环表示,具体语句自己多看看就会了。
distances = [sqrt(np.sum((x_train - s)**2)) for x_train in x_train]
# for x_train in x_train:
# d = sqrt(np.sum((x_train - s)**2))
# distances.append(d)
- 同时,表示出来距离数据点的横纵坐标。
#找到与数据点最近的点有哪些!使用np.argsort()将数组中的数进行排序,返回出具体数值的索引!
#print(np.argsort(distances))
#[6 3 5 8 0 1 4 9 7 2]返回的索引
nearest = np.argsort(distances)#把数组给这个变量
k = 6
topk_y = [y_train[i] for i in nearest[:k]]
#print(topk_y)[1, 0, 1, 1, 0, 0]这样可以观察一下得到点的纵坐标
- 投票比较选择出分类种类
#统计该坐标包含的元素,和出现的频率,可以将这个过程看成投票的过程!
votes = Counter(topk_y)
#取出最多的那个一数,但是返回的是一个列表,我们只需要他的数值,不需要他的个数所以去【0】,
predict_y = votes.most_common(1)[0][0]
代码整合!
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
from math import sqrt
from collections import Counter
raw_data_X = [ [3.393533211,2.331273381 ],
[3.110073483,1.781539638],
[1.343808831,3.368360954],
[3.582294042,4.679179110],
[2.280362439,2.866990263],
[7.423436942,4.696522875],
[5.745051997,3.533989803],
[9.172168622,2.511101045],
[7.792783481,3.424088941],
[7.939820817,0.791637231] ]
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)
s = np.array([5.425516942,3.6456522875])
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(s[0],s[1],color="y")
plt.show()
distances = [sqrt(np.sum((x_train - s)**2)) for x_train in x_train]
# for x_train in x_train:
# d = sqrt(np.sum((x_train - s)**2))
# distances.append(d)
#print(distances)
#找到与数据点最近的点有哪些!使用np.argsort()将数组中的数进行排序,返回出具体数值的索引!
#print(np.argsort(distances))
#[6 3 5 8 0 1 4 9 7 2]返回的索引
nearest = np.argsort(distances)#把数组给这个变量
k = 6
topk_y = [y_train[i] for i in nearest[:k]]
#print(topk_y)[1, 0, 1, 1, 0, 0]这样可以观察一下得到点的纵坐标
#统计该坐标包含的元素,和出现的频率,可以将这个过程看成投票的过程!
votes = Counter(topk_y)
#取出最多的那个一数,但是返回的是一个列表,我们只需要他的数值,不需要他的个数所以去【0】,
predict_y = votes.most_common(1)[0][0]
通过具体的方法来理解机器学习中的KNN算法,这里的语句都很简单。同样算法的封装主要运用函数的方式
这里直接给展示一下分装之后加入的断言(就是判断数据中的数据时候输入正确!)
这里断言的目的就是防止用户使用算法的时候将数据传入错误而加的。
在算法中knn算法中我们并没有的到模型,knn算法是没有模型的算法,其实训练数据集本可以看做训练数据集的模型。同样每一个算法都会fit过程。
使用scikit—learn中的KNN
机器学习中的算法都是面向对象进行包装的。shi’yo
#加载对应的算法
from sklearn.neighbors import KNeighborsClassifier
#创建算法对应的实例
kNN_classifier = KNeighborsClassifier(n_neighbors=6)
#需要经行fit来拟合训练数据籍
kNN_classifier.fit(x_train,y_train)
S = s.reshape(1,-1)
P = kNN_classifier.predict(S)
print(P)
这是一个标准的过程,在以后的使用中都会是这样一个过程。
要经行fit来拟合训练数据籍
kNN_classifier.fit(x_train,y_train)
S = s.reshape(1,-1)
P = kNN_classifier.predict(S)
print§
这是一个标准的过程,在以后的使用中都会是这样一个过程。
这里我们也能自己把代码封装起来,但是作为初学者为了提高学习效率,就不写了。