1. 程式人生 > 其它 >KNN演算法實現對iris資料集的預測

KNN演算法實現對iris資料集的預測

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)

沒有做交叉驗證,所以附上訓練資料集和測試資料集

測試資料集,點選下載

直接顯示

訓練資料集,點選下載

直接顯示