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)

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

测试数据集,点击下载

直接显示

训练数据集,点击下载

直接显示

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值