原生python实现KNN分类算法,用鸢尾花数据集

python机器学习导论

一、作业题目

原生python实现KNN分类算法,用鸢尾花数据集

二、算法设计

三、源代码

1)读取文件

def data_read(filepath):  # 读取txt文件,将读出的内容存入datas列表中
   
fp = open(filepath, "r")
    datas = [] 
# 存储处理后的数据
   
lines = fp.readlines()  # 读取整个文件数据
   
for line in fp.readlines():
       
if not line.strip(): continue
       
r = line.split('\t')
       
if len(r) < 3: continue
       
print (r)
       
try:
            records.setdefault(
int(r[1]), {})
            records[
int(r[1])].setdefault(int(r[0]), {})
            records[
int(r[1])][int(r[0])] = float(r[2])
       
except ValueErro:
           
continue
2)数据分割分组
    for line in lines:
        row = line.strip(
'\n').split(' '# 去除两头的换行符,按空格分割
       
datas.append(row)
    fp.close()
   
return datas
datas = data_read(
"iris .txt")
training_list = [] 
# 训练集的数据
label_list = []  # 训练集的标签
text_list = []  # 测试集数据
textlabel_list = []  # 测试集标签
labeldata_tuple = ()  # 转换列表为元组
mydict = {}  # 以四维数据为键,以鸢尾花的特征为值。这样便可唯一标识


for i in range(0, 105):  # 数据集按照3:7的比例划分,其中105行为训练集,45行为测试集
   
training_list.append([datas[i][0], datas[i][1], datas[i][2], datas[i][3]])
    label_list.append(datas[i][
4])

for i in range(105, 150):  # 测试集的数据
   
text_list.append([datas[i][0], datas[i][1], datas[i][2], datas[i][3]])
    textlabel_list.append(datas[i][
4])
2)数据计算距离
j = 0
for i in training_list:
    labeldata_tuple =
tuple(i)
    mydict.update({labeldata_tuple: label_list[j]})
    j = j +
1
add = 100
index = 0
distance_list = []
train_list = []

for key, value in mydict.items():
    train_list.append(key)

right =
# 分子
count = # 分母
'''
在计算距离时,使用绝对距离来计算。
得到的最小值就是距离最小值。
'''

for i in range(len(text_list)):
    count +=
1
   
for j in range(len(train_list)):
        add1 =
abs(float(train_list[j][0]) - float(text_list[i][0]))\
               +
abs(float(train_list[j][1])- float(text_list[i][1]))\
               +
abs(float(train_list[j][2]) - float(text_list[i][2]))\
               +
abs(float(train_list[j][3])- float(text_list[i][3]))
        distance_list.append(add1)
       
if add > add1:
            add = add1
            index = train_list[j]
   
print("预测", text_list[i], "的标签是:", mydict.get(index))
   
if mydict.get(index) == textlabel_list[i]:  # 当计算出来的1个近邻与测试集正确的标签相同时,分子加一
       
right = right + 1
print('预测准确性:{:.2f}'.format(right / count))

 

四、测试用例设计及调试过程截屏

运行结果:

五、总结

问题及解决:

1、提示找不到文件

因为在写文件名时,在iris后多了一个空格,因此,修改一下文件名或者代码就可以正常运行。

 

2、提示集合越界

因为读取文件irsi.txt时,直接从第一行开始,按“,”分割,而文件中每组数据间是用空格分开的,因此,将代码改为,按空格分割。

其他方法参考如下:

https://wenda.so.com/q/1381757838064792?src=180&q=python%E8%BF%90%E8%A1%8C%E5%87%BA%E9%94%99IndexError%3A+list+index+out+of+range

代码参考:

https://blog.csdn.net/chen_shiqiang/article/details/51927598

心得体会:

对于python程序的基本语法以及列表,循环结构等在python中的运用方法有了进一步了解。同时,知道了在python中文件读取方式以及进行相应操作的函数。

六、CSDN博客

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值