zoukankan      html  css  js  c++  java
  • 用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('	') #去除换行号,分割制表符
    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('数据集:
    ',data)
    40 print('标签集:
    ',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

  • 相关阅读:
    python -- twisted初探
    python -- redis连接与使用
    redis使用
    python -- 异步编程
    python
    python
    福大软工 · 最终作业
    福大软工 · 第十二次作业
    Beta 冲刺(7/7)
    Beta 冲刺(6/7)
  • 原文地址:https://www.cnblogs.com/LCcnblogs/p/6262034.html
Copyright © 2011-2022 走看看