22行代碼(python)快速實現KNN及可視化(附數據下載鏈接)

本文使用簡單的例子,使用22行代碼(刨除註釋),快速實現knn。爲了更加方便理解,沒有使用knn的函數,只是用了簡單的矩陣操作和計數操作,希望對初學者有幫助。

先來看看數據的格式:
在這裏插入圖片描述
在這裏插入圖片描述
(下載地址:鏈接:https://pan.baidu.com/s/1j3JsTJUZtV0sgQEVl0UQJg 提取碼:7idx )

每一個動物對應17個特徵,包括有沒有羽毛、下不下蛋等。其中最後一個特徵(第二幅圖的最後一列)表示動物的類別。我們的目的是使用前面的16個特徵利用knn預測動物的類別。所以沒有使用到動物的名字信息。

話不多說,直接上代碼,改一下讀取數據的路徑,可以直接跑通:

#使用屬性預測動物的7種類別
import pandas as pd
import numpy as np
from collections import Counter
#讀數據,別忘了改路徑
ZooData = pd.read_csv('/your_path/zoo.csv')
#將dataframe轉換爲數組,方便計算,同時捨棄了動物的名字的信息,因爲對於這個程序沒有用
X = np.array(ZooData.iloc[0:101,1:17])
Y = np.array(ZooData.iloc[0:101,17])
#超參數k取4
k = 4
#總共101個數據,將每一個數據分別拿出來進行預測,預測對的數量爲predict_true
predict_true = 0
for i in range(0,101):
    #取出要預測的樣本
    x_p = X[i]
    y_p = Y[i]
    #從數據中刪除要預測的樣本
    X_p = np.delete(X,i,axis=0)
    Y_p = np.delete(Y,i,axis=0)
    #計算待預測樣本與數據中其它樣本的距離
    distances=[np.sqrt(np.sum((x_p-x)**2)) for x in X_p]
    #排序
    d = np.sort(distances)
    #排序的索引號
    nearest = np.argsort(distances)
    #取出最接近的k個
    topk_y = [Y_p[j] for j in nearest[:k]]
    #接近最多的作爲預測標籤
    votes = Counter(topk_y)
    predict_y=votes.most_common(1)[0][0]
    #預測對了,predict_true增加1
    if(predict_y==y_p): predict_true += 1
#計算正確率    
precision = predict_true/101        
#雷達圖可視化
pd.plotting.radviz(ZooData.iloc[0:100,1:18], 'class_type')

代碼的註釋寫的很清晰了,不再贅述。最後看一下可視化的雷達圖。

在這裏插入圖片描述
可以發現還是有一定的分佈規律的,當超參數k=4的時候,準確率可以達到94%。

歡迎討論 歡迎吐槽

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章