修改预测函数
def predict_math(X, xtrain, ytrain):
# 求L2距离
distances = [sqrt(np.sum((X_train - X) ** 2)) for X_train in xtrain]
# 对数组进行排序,返回的是值的索引值
nearest = np.argsort(distances)
# 取出前3个离得最近的点的标签
k = 3
topK_y = [ytrain[i] for i in nearest[:k]]
# 计数,取到键值对。键:标签;值:个数
votes = Counter(topK_y)
# 在键值对中值最多的键
print(votes.most_common(1)[0][0])
# 得到最接近的3个点的索引值
k = 3
topK_X = nearest[:k]
for i in range(3):
# 绘制预测点与最接近的3个点连成的直线
plt.plot([X[0], xtrain[topK_X[i]][0]], [X[1], xtrain[topK_X[i]][1]])
# 绘制预测点与最接近的3个点之间的长度
plt.annotate("%s"%round(distances[topK_X[i]], 2),
xy=((X[0] + xtrain[topK_X[i]][0]) / 2,(X[1] +
xtrain[topK_X[i]][1]) / 2))
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.scatter(x_train[y_train == 0, 0], x_train[y_train == 0, 1], marker="*")
plt.scatter(x_train[y_train == 1, 0], x_train[y_train == 1, 1], marker="^")
plt.scatter(x_train[y_train == 2, 0], x_train[y_train == 2, 1], marker="s")
plt.scatter(x_test[0], x_test[1], marker="o")
plt.show()
在输出所属类别的基础上绘制预测点与最接近的3个点连成的直线,并标出它们的距离,KNN结果如图所示。
KNN结果