用python实现k近邻算法

时间:2024-01-01 13:58:33

  用python写程序真的好舒服。

  code:

 import numpy as np

 def read_data(filename):
'''读取文本数据,格式:特征1 特征2 …… 类别'''
f=open(filename,'rt')
row_list=f.readlines() #以每行作为列表
f.close()
data_array=[]
labels_vector=[]
while True:
if not row_list:
break
row=row_list.pop(0).strip().split('\t') #去除换行号,分割制表符
temp_data_row=[float(a) for a in row[:-1]] #将字符型转换为浮点型
data_array.append(temp_data_row) #取特征值
labels_vector.append(row[-1]) #取最后一个作为类别标签
return np.array(data_array),np.array(labels_vector) def classify(test_data,dataset,labels,k):
'''分类'''
diff_dis_array=test_data-dataset #使用numpy的broadcasting
dis_array=(np.add.reduce(diff_dis_array**2,axis=-1))**0.5 #求距离
dis_array_index=np.argsort(dis_array) #升序距离的索引
class_count={}
for i in range(k):
temp_label=labels[dis_array_index[i]]
class_count[temp_label]=class_count.get(temp_label,0)+1 #获取类别及其次数的字典
sorted_class_count=sorted(class_count.items(), key=lambda item:item[1],reverse=True) #字典的值按降序排列
return sorted_class_count[0][0] #返回元组列表的[0][0] def normalize(dataset):
'''数据归一化'''
return (dataset-dataset.min(0))/(dataset.max(0)-dataset.min(0)) k=3 #近邻数
test_data=[0,0] #待分类数据
data,labels=read_data('testdata.txt')
print('数据集:\n',data)
print('标签集:\n',labels)
result=classify(test_data,normalize(data),labels,k)
print('分类结果:',result)

  一个示例的数据集testdata.txt(以制表符隔开):

  1.0 1.1 A
  1.0 1.0 A
  0 0 B
  0 0.1 B