用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM