KNN算法
1. 定义
k-近邻算法(k-Nearest Neighbour algorithm),又称为KNN算法,是机器学习中原理最简单的算法。
2. 原理
给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻近的k个实例,如果这k个实例的多数属于某个类别,那么新数据就属于这个类别。可以简单理解为:由那些离X最近的k个点来投票决定X归为哪一类。
2.1数学原理:
欧拉距离:
( x ( a ) − x ( b ) ) 2 + ( y ( a ) − y ( b ) ) 2 \sqrt{(x^{(a)}-x^{(b)})^2+(y^{(a)}-y^{(b)})^2} (x(a)−x(b))2+(y(a)−y(b))2
当数据集的特征比较多,为n时:
( x ( a ) − x ( b ) ) 2 + ( y ( a ) − y ( b ) ) 2 + ( z ( a ) − z ( b ) ) 2 + ⋯ + ( N ( a ) − N ( b ) ) 2 \sqrt{(x^{(a)}-x^{(b)})^2 + (y^{(a)}-y^{(b)})^2 + (z^{(a)}-z^{(b)})^2 + \cdots + (N^{(a)}-N^{(b)})^2} (x(a)−x(b))2+(y(a)−y(b))2+(z(a)−z(b))2+⋯+(N(a)−N(b))2
3.例子
# 肿瘤预测案例
import numpy as np
import matplotlib.pyplot as plt
# row data 是python中普通的list
row_data_X = [[3.3935, 2.3312],
[3.1101, 1.7815],
[1.3438, 3.3684],
[3.5823, 4.6792],
[2.2804, 2.8670],
[7.4234, 4.6965],
[5.7451, 3.5340],
[9.1722, 2.5111],
[7.7928, 3.4241],
[7.9398, 0.7916]]
# 0:良性肿瘤,1:恶性肿瘤
row_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
# 将数据变为np数据
X_train = np.array(row_data_X)
y_train = np.array(row_data_y)
x = np.array([8.0936, 3.3657]) # 给定待测点
# plot,将不同label的点区分开
plt.scatter(X_train[y_train==0,0],X_train[y_train==0,1],color='r') # 注意这种取值方式
plt.scatter(X_train[y_train==1,0],X_train[y_train==1,1],color='b')
plt.scatter(x[0],x[1],color='g')
plt.show()
# 计算待测点与所有点的距离,并放到1个列表
from math import sqrt
distances = [sqrt(np.sum((x_train - x)**2)) for x_train in X_train ]
# 找出距离最近的k个点,并知道它的label
k = 6
arg_nearests = np.argsort(distances)
top_K = [y_train[arg_nearest] for arg_nearest in arg_nearests[:k] ]
print("the nearest is: \n", top_K)
the nearest is:
[1, 1, 1, 1, 1, 0]
# 计算各个元素的数量
from collections import Counter
Counter(top_K)
Counter({1: 5, 0: 1})
votes = Counter(top_K)
votes.most_common(1) # 求最多的值,1表示最多的1个
[(1, 5)]
votes.most_common(1)[0][0] # 选这个列表的第0个,元组的第0个
1
最后判断改待测点最大可能是1