python实现KNN算法并可视化展示
生活随笔
收集整理的這篇文章主要介紹了
python实现KNN算法并可视化展示
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
話不多說,直接上代碼,本代碼采用的是鳶尾花數據集,來實現KNN算法
import matplotlib.pyplot as plt import matplotlib as mpl import pandas as pd import numpy as np# 讀取鳶尾花數據集,header參數來指定標題的行,默認是0,如果沒有標題,參數設置為None data = pd.read_csv(r"C:\\Users\\不歸客\Desktop\\iris.csv", header=0)# 隨機抽取一定的數據,默認為1行 # print(data.sample())# 數據清洗,將Species列轉為數值類型 data["Species"] = data["Species"].map({"versicolor": 0, "setosa": 1, "virginica": 2}) # 刪除不需要的Id列,默認是刪除行,axis=1是指刪除列 # drop是刪除副本中的數據,inplace=True是指用副本替換掉原本 data.drop("Id", axis=1, inplace=True) # 判斷數據集中是否有重復項,只要有重復項,結果就為True # data.duplicated().any() if data.duplicated().any():# 刪除重復項data.drop_duplicates(inplace=True)# 查看每個類別的鳶尾花有多少條數據 print(data["Species"].value_counts())class KNN:def __init__(self, k):'''初始化方法Parameters--------K:鄰居的個數'''self.k = kdef fit(self, X, y):'''訓練方法Parameters--------X:類數組類型,形狀為[樣本數量,特征數量] [149,4]待訓練的樣本特征(屬性)y:類數組類型,形狀為[樣本數量]每個樣本的目標值(標簽)'''# 將X轉換為ndarray數組類型self.X = np.asarray(X)self.y = np.asarray(y)def predict(self, X):'''根據參數傳遞的樣本,進而對樣本數據進行預測Parameters--------X:類數組類型,形狀為[樣本數量,特征數量] [149,4]待訓練的樣本特征(屬性)Returns-------result:數組類型預測的結果'''X = np.asarray(X)result = []# 對ndarray數組進行遍歷,每次取數組中的一行for x in X:# sum默認是將所有的數值求和,axis=1是按行求和dis = np.sqrt(np.sum(((x - self.X) ** 2), axis=1))# 返回數組排序后每個數組在原數組中的索引index = dis.argsort()# 進行截斷,只取前k個元素index = index[:self.k]# bincount返回每個元素出現的次數,元素必須是非負的整數count = np.bincount(self.y[index])# 返回ndarray數組中,值最大的元素對應的索引,該索引就是我們判定的類別# 最大元素,就是出現次數最多的元素result.append(count.argmax())return np.asarray(result)# 將數據集隨機打亂 t0 = data[data["Species"] == 0] t1 = data[data["Species"] == 1] t2 = data[data["Species"] == 2] # 對每個類別數據進行洗牌 t0 = t0.sample(len(t0), random_state=0) t1 = t1.sample(len(t1), random_state=0) t2 = t2.sample(len(t2), random_state=0) # 構建訓練集與測試集 train_X = pd.concat([t0.iloc[:40, :-1], t1.iloc[:40, :-1], t2.iloc[:40, :-1]], axis=0) train_y = pd.concat([t0.iloc[:40, -1], t1.iloc[:40, -1], t2.iloc[:40, -1]], axis=0) test_X = pd.concat([t0.iloc[40:, :-1], t1.iloc[40:, :-1], t2.iloc[40:, :-1]], axis=0) test_y = pd.concat([t0.iloc[40:, -1], t1.iloc[40:, -1], t2.iloc[40:, -1]], axis=0)# 創建KNN對象,進行訓練與測試 knn = KNN(k=3) # 進行訓練 knn.fit(train_X, train_y) # 進行測試,獲得測試結果 result = knn.predict(test_X) print("預測正確的個數:", np.sum(result == test_y), "測試集的總數:", len(test_y), "預測準確率:", np.sum(result == test_y)/len(test_y))''' 將預測結果可視化展示 ''' # 設置畫布大小 plt.figure(figsize=(10,10)) # 設置參數,保證可以中文顯示 mpl.rcParams["font.family"] = "SimHei" mpl.rcParams["axes.unicode_minus"] = False # 訓練集數據,繪制散點圖,選擇其中兩個屬性進行繪制 plt.scatter(x=t0["Sepal.Length"][:40], y=t0["Petal.Length"][:40], color="r", label='virginica') plt.scatter(x=t1["Sepal.Length"][:40], y=t1["Petal.Length"][:40], color="green", label='setosa') plt.scatter(x=t2["Sepal.Length"][:40], y=t2["Petal.Length"][:40], color="b", label='versicolor') # 繪制測試集數據 right = test_X[result == test_y] wrong = test_X[result != test_y] plt.scatter(x=right["Sepal.Length"], y=right["Petal.Length"],color='c', marker="x", label='right') plt.scatter(x=wrong["Sepal.Length"], y=wrong["Petal.Length"],color='m', marker=">", label='wrong') plt.xlabel("花萼長度") plt.ylabel("花瓣長度") plt.title("KNN分類結果顯示") plt.legend() plt.show()下圖是輸出結果,藍色的×代表預測正確的值,紫色的三角符號代表預測錯誤的值,三個圓點代表訓練數據集。
紅色標注的是將數據集按照種類分類后每類的數據集的個數
紫色標注的是預測正確的個數、測試集總數以及預測準確率
數據集在百度網盤,鏈接如下
鏈接:https://pan.baidu.com/s/1gOTQ1KoKbFUmDNQYA_0nWg
提取碼:soft
總結
以上是生活随笔為你收集整理的python实现KNN算法并可视化展示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 富文本及编辑器的跨平台方案
- 下一篇: 2021年美容师(中级)新版试题及美容师