代码中用到了 heapq 模块, Counter , lambda 表达式等稍微复杂的运用,请大家自行理解
# 要添加一个新单元,输入 '# %%'
# 要添加一个新的标记单元,输入 '# %% [markdown]'
# %%
import heapq
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from collections import Counter
# %%
# 加载数据
iris = load_iris()
# 切分 X 和 y
X = iris.data[:, :2]
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=12)
# %%
def knn(X_train, X_test, y_train, y_test, k=3):
count = 0
# 遍历测试数据里面的每一行,外汇跟单gendan5.com计算最小的 k 个距离以及它们的 y
for i in range(X_test.shape[0]):
# 计算每个点的欧式距离
diff = X_train - X_test[i]
distance_list = [np.linalg.norm(_) for _ in diff]
# 将距离和 y_train 组合
combine_list = zip(distance_list, y_train.tolist())
# 用 heapq 找出最小的 k 个值
top_k_list = heapq.nsmallest(k, combine_list, key=lambda x : x[0])
# 找出最小个 k 个值对应的 y 中出现最多的
y = Counter([c[1] for c in top_k_list]).most_common(1)[0][0]
if y == y_test[i]:
count = count + 1
print("{0} 预测属于: {1} ,实际属于: {2}".format(X_test[i], y, y_test[i]))
# 所有行遍历完以后,输出准确率
print(" 总共 {0} 个测试数据, {1} 个准确,正确率 {2:.2f}%".format(X_test.shape[0], count, count/X_test.shape[0]*100))
knn(X_train, X_test, y_train, y_test)
# %%
[5. 3.5] 预测属于: 0 ,实际属于: 0
[6.3 2.5] 预测属于: 2 ,实际属于: 2
[4.4 3. ] 预测属于: 0 ,实际属于: 0
[5.7 2.8] 预测属于: 1 ,实际属于: 1
[6.8 3.2] 预测属于: 2 ,实际属于: 2
[6.5 3. ] 预测属于: 2 ,实际属于: 2
[6.2 3.4] 预测属于: 2 ,实际属于: 2
[5.1 3.4] 预测属于: 0 ,实际属于: 0
[7.7 3. ] 预测属于: 2 ,实际属于: 2
[5.1 3.3] 预测属于: 0 ,实际属于: 0
[5.6 3. ] 预测属于: 1 ,实际属于: 1
[5.4 3.9] 预测属于: 0 ,实际属于: 0
[5.4 3.4] 预测属于: 0 ,实际属于: 0
[5.1 3.7] 预测属于: 0 ,实际属于: 0
[7. 3.2] 预测属于: 2 ,实际属于: 1
[7.2 3.2] 预测属于: 2 ,实际属于: 2
[6.7 2.5] 预测属于: 1 ,实际属于: 2
[5.9 3. ] 预测属于: 2 ,实际属于: 1
[4.6 3.4] 预测属于: 0 ,实际属于: 0
[6.3 2.5] 预测属于: 2 ,实际属于: 1
[4.9 3. ] 预测属于: 0 ,实际属于: 0
[6.1 2.8] 预测属于: 1 ,实际属于: 1
[6.2 2.8] 预测属于: 1 ,实际属于: 2
[6. 2.9] 预测属于: 1 ,实际属于: 1
[4.8 3.4] 预测属于: 0 ,实际属于: 0
[6.7 3. ] 预测属于: 2 ,实际属于: 2
[6.7 3. ] 预测属于: 2 ,实际属于: 1
[5.5 2.6] 预测属于: 1 ,实际属于: 1
[4.8 3.4] 预测属于: 0 ,实际属于: 0
[4.5 2.3] 预测属于: 1 ,实际属于: 0
[5.1 3.5] 预测属于: 0 ,实际属于: 0
[5.5 2.4] 预测属于: 1 ,实际属于: 1
[6.3 2.9] 预测属于: 1 ,实际属于: 2
[5.5 4.2] 预测属于: 0 ,实际属于: 0
[5.8 2.7] 预测属于: 1 ,实际属于: 2
[5.7 4.4] 预测属于: 0 ,实际属于: 0
[5.6 2.9] 预测属于: 1 ,实际属于: 1
[5.5 2.4] 预测属于: 1 ,实际属于: 1
[5.8 4. ] 预测属于: 0 ,实际属于: 0
[6. 2.2] 预测属于: 1 ,实际属于: 1
[5.1 2.5] 预测属于: 1 ,实际属于: 1
[5. 3.4] 预测属于: 0 ,实际属于: 0
[4.4 2.9] 预测属于: 0 ,实际属于: 0
[5.1 3.8] 预测属于: 0 ,实际属于: 0
[4.8 3. ] 预测属于: 0 ,实际属于: 0
总共 45 个测试数据, 36 个准确,正确率 80.00%