KNN算法-分类
样本距离判断:欧氏距离、曼哈顿距离、明可夫斯基距离
KNN算法原理:
K-近邻算法(
K-Nearest Neighbors
,简称
KNN
)
,
根据
K
个邻居样本的类别来判断当前样本的类别
; 如果一个样本在特征空间中的k
个最相似
(
最邻近
)样本中的大多数属于某个类别,则该类本也属于这个类别(
近朱者赤近墨者黑
) 。
一般情况下,我们需要先指定一个k,当一个新的数据集来临时,我们首先计算这个新的数据跟训练集中的每一个数据的距离,一般使用欧氏距离。然后从中选出距离最近的k个点,这个k一般选取为奇数,方便后面投票决策。在k个点中根据最多的确定新的数据属于哪一类。
KNN算法内容代码
创建数据集x_train, y_train,和一个新的数据x_new, 并将其可视化
import numpy as np
import matplotlib.pyplot as plt
raw_data_x = [[3.39, 2.33],
[3.11, 1.15],
[1.38, 3.84],
[3.53, 4.92],
[2.24, 2.80],
[7.42, 4.65],
[5.71, 3.50],
[9.12, 2.91],
[7.79, 3.41],
[7.98, 0.71]]
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_new = np.array([8.06, 3.37])
#作散点图
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_new[0], x_new[1], color='b')
plt.show()
knn基础过程
计算距离
from math import sqrt
distances = [sqrt(np.sum((x_new - x) ** 2)) for x in x_train]
#print(distances)#这一步可以输出计算距离
将距离进行排序,返回的是排序之后的索引位置
nearsest = np.argsort(distances)
print(nearest)
输出结果:
取k个点,假设k=5
k=5
new_y=[y_train[i] for i in nearest[:k]]
print(new_y)
输出结果为:[1, 1, 1, 1, 1]
根据结果得知,新来的数据距离最近的5个点,都属于1类,所以新来的数据属于第一类
投票
from collections import Counter
Counter(new_y)
输出结果:Counter({1: 5})
当新来的数据距离最近的5个点不是同属于一类时,服从少数服从多数原则,新来的数据属于多数的一类
代码如下:
votes = Counter(new_y)
votes.most_common(1)
y_new = votes.most_common(1)
#most_common(n)函数返回出现次数最多的n个元素及其次数
print(y_new)
使用sklearn中的knn
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
raw_data_x = [[3.39, 2.33],
[3.11, 1.15],
[1.38, 3.84],
[3.53, 4.92],
[2.24, 2.80],
[7.42, 4.65],
[5.71, 3.50],
[9.12, 2.91],
[7.79, 3.41],
[7.98, 0.71]]
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_new = np.array([8.06, 3.37])
knn_classifier=KNeighborsClassifier(n_neighbors=5)
knn_classifier.fit(x_train,y_train)
y_new = knn_classifier.predict(x_new.reshape(1, -1))#固定1行,列数直接计算好
print(y_new[0])
输出:1
sklearn 用KNN算法对鸢尾花进行分类
from sk