Loading

KNN算法实现对iris数据集的预测

KNN算法的实现

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


# 用于我懒得把测试数据和训练数据封装成不同类,所以就会在成员变量里面同时出现测试数据专有的属性和测试数据的专有属性
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)

没有做交叉验证,所以附上训练数据集和测试数据集

测试数据集,点击下载

直接显示

训练数据集,点击下载

直接显示

posted @ 2021-10-29 10:53  [X_O]  阅读(265)  评论(0编辑  收藏  举报