用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

 

posted @ 2017-01-08 15:06  LC_coding  阅读(5699)  评论(6编辑  收藏  举报