用python实现k近邻算法
用python写程序真的好舒服。
code:
1 import numpy as np 2 3 def read_data(filename): 4 '''读取文本数据,格式:特征1 特征2 …… 类别''' 5 f=open(filename,'rt') 6 row_list=f.readlines() #以每行作为列表 7 f.close() 8 data_array=[] 9 labels_vector=[] 10 while True: 11 if not row_list: 12 break 13 row=row_list.pop(0).strip().split('\t') #去除换行号,分割制表符 14 temp_data_row=[float(a) for a in row[:-1]] #将字符型转换为浮点型 15 data_array.append(temp_data_row) #取特征值 16 labels_vector.append(row[-1]) #取最后一个作为类别标签 17 return np.array(data_array),np.array(labels_vector) 18 19 def classify(test_data,dataset,labels,k): 20 '''分类''' 21 diff_dis_array=test_data-dataset #使用numpy的broadcasting 22 dis_array=(np.add.reduce(diff_dis_array**2,axis=-1))**0.5 #求距离 23 dis_array_index=np.argsort(dis_array) #升序距离的索引 24 class_count={} 25 for i in range(k): 26 temp_label=labels[dis_array_index[i]] 27 class_count[temp_label]=class_count.get(temp_label,0)+1 #获取类别及其次数的字典 28 sorted_class_count=sorted(class_count.items(), key=lambda item:item[1],reverse=True) #字典的值按降序排列 29 return sorted_class_count[0][0] #返回元组列表的[0][0] 30 31 def normalize(dataset): 32 '''数据归一化''' 33 return (dataset-dataset.min(0))/(dataset.max(0)-dataset.min(0)) 34 35 36 k=3 #近邻数 37 test_data=[0,0] #待分类数据 38 data,labels=read_data('testdata.txt') 39 print('数据集:\n',data) 40 print('标签集:\n',labels) 41 result=classify(test_data,normalize(data),labels,k) 42 print('分类结果:',result)
一个示例的数据集testdata.txt(以制表符隔开):
1.0 1.1 A
1.0 1.0 A
0 0 B
0 0.1 B