原生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 = 0 # 分子
count = 0 # 分母
'''
在计算距离时,使用绝对距离来计算。
得到的最小值就是距离最小值。
'''
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://blog.****.net/chen_shiqiang/article/details/51927598
心得体会:
对于python程序的基本语法以及列表,循环结构等在python中的运用方法有了进一步了解。同时,知道了在python中文件读取方式以及进行相应操作的函数。
六、****博客