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

  • 相关阅读:
    linux下samba服务器的搭建(案列模拟)
    linux下nfs服务器的搭建
    linux 下 php+gd2+freetype+jpeg+png+zlib编译安装
    linux下xcache的安装
    wget如何设置代理
    实验记录:vsftp整合mysql-pam管理虚拟账号
    tr命令 实例
    sed学习笔记
    Byte、KB、MB、GB、TB、PB转换
    对lombbok @slf4j 进行测试用例
  • 原文地址:https://www.cnblogs.com/LCcnblogs/p/6262034.html
Copyright © 2011-2022 走看看