KNN演算法實現對iris資料集的預測
阿新 • • 發佈:2021-10-29
KNN演算法的實現
第一次寫機器學習演算法,寫的是KNN預測iris資料集、不會矩陣運算,實現起來很呆,但是總歸還是實現了
import pandas as pd from math import dist k = int(input("請輸入k值(不能輸入三的倍數!):")) dataTest = pd.read_csv('iristest.csv', header=None).values trainData = pd.read_csv('iristrain.csv', header=None).values iris = pd.read_csv('iris.csv', header=None) # 用於我懶得把測試資料和訓練資料封裝成不同類,所以就會在成員變數裡面同時出現測試資料專有的屬性和測試資料的專有屬性 class Data: """ 這個類用來封裝每一個數據的資訊 info:資料的前4列 Label:資料標籤 predict_label:資料的使用knn演算法預測的標籤 dis:資料離測試資料的距離 """ def __init__(self, info, label, dis=None, predict_label=None): self.info = info self.label = label self.dis = dis self.predict_label = predict_label def __str__(self): return "info={0}、dis={1}、label={2}、predict_label={3}".format(self.info, self.dis, self.label, self.predict_label) # 重寫__lt__函式方便sort直接排序 def __lt__(self, other): return self.dis < other.dis trainDataInClass = [] for item in trainData: trainDataInClass.append(Data(item[0:4], item[-1])) def getTestLabel(test_data): """ :param test_data: 輸入點 :return: 返回該點的類別 本函式用於做輸入資料的分類 """ # 定義一個列表,用來儲存距離 distance = [] for m in trainDataInClass: # dist是一個直接計算歐氏距離的函式 m.dis = dist(m.info, test_data.info) distance.append(m) distance.sort() # 定義一個列表來儲存最近前k名的Label label_top = [] for j in range(0, k): label_top.append(distance[j].label) test_data.predict_label = max(label_top, key=label_top.count) return test_data # 測試資料 # 定義一個儲存預測之後的資料的列表 predict_list = [] for item in dataTest: predict_list.append(getTestLabel(Data(item[0:4], item[-1]))) # 定義一個變數用於儲存預測準確的資料數量 predict_true_cnt = 0 for item in predict_list: if item.label == item.predict_label: predict_true_cnt += 1 # 計算精度 precision = predict_true_cnt / len(predict_list) print(precision)
沒有做交叉驗證,所以附上訓練資料集和測試資料集
測試資料集,點選下載
訓練資料集,點選下載