ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-10-29 11:01:17  阅读:234  来源: 互联网

标签:KNN iris predict self label item 算法 __ dis


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)

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

测试数据集,点击下载

直接显示

训练数据集,点击下载

直接显示

标签:KNN,iris,predict,self,label,item,算法,__,dis
来源: https://www.cnblogs.com/GreenOrange/p/15479378.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有