机器学习笔记(KNN算法)

代码中用到了 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%


请使用浏览器的分享功能分享到微信等