機器學習筆記(KNN演算法)

專注的阿熊發表於2021-07-02

程式碼中用到了 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%


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2779491/,如需轉載,請註明出處,否則將追究法律責任。

相關文章