import numpy as np
import matplotlib.pyplot as plt # 画图用
import math
# 这是训练集
train_x = [[3.3935, 2.3312],
[3.1100, 1.7815],
[1.3438, 3.3686],
[3.5822, 4.6791],
[2.2803, 2.8669],
[7.4234, 4.6965],
[5.7450, 3.5339],
[9.1721, 2.5111],
[7.7927, 3.4240],
[7.9398, 0.7916]]
# 结果集
train_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
# 在这里将数据集转化为numpy类型的
trainx = np.array(train_x)
trainy = np.array(train_y)
# x 为测试的点的位置
x = np.array([8.0936, 3.3657])
# 将属于不同类的点画出
plt.figure(figsize=(10, 6)) # figsize是画布的大小
plt.scatter(trainx[trainy == 0, 0], trainx[trainy == 0, 1])
plt.scatter(trainx[trainy == 1, 0], trainx[trainy == 1, 1])
plt.scatter(x[0], x[1]) # 将要测试的点也画出来
# plt.show()
# 计算出测试点到各个点之间的距离
# 这里计算距离用的是 欧氏距离
distances = []
for x_train in trainx:
d = math.sqrt(np.sum((x_train - x)**2))
distances.append(d)
print(distances)
# distances.sort()
# 将存放距离的列表进行排序, 这里用numpy下的argsort进行排序。返回的是: 下标
argsort = np.argsort(distances)
print(argsort)
# 定义K的值
k = 6
# 把距离测试点最近的k个点取出
topK_y = [trainy[i] for i in argsort[:k]]
print(topK_y)
# Counter用来计数
from collections import Counter
# Counter是对topK_y中的0, 1进行计数,返回的是 字典
votes = Counter(topK_y)
# 将字典中最多的这一组取出并取出它所属类
x_lei = votes.most_common(1)[0][0]
print(x_lei)
输出结果:
[4.81260119478022, 5.22933634412628, 6.749800622981393, 4.698696576711461, 5.834660086928801, 1.4900324425998253, 2.354615297665417, 1.3760462964595341, 0.3064958401022765, 2.578690607653427]
[8 7 5 6 9 3 0 1 4 2]
[1, 1, 1, 1, 1, 0]
Counter({1: 5, 0: 1})
1
K近邻是机器学习中及其简单的一种算法。思想也是非常简单。很少用数学公式。K近邻思想看上一篇
机器学习K近邻算法