• KNN算法--python实现


    邻近算法

    或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。

    关于K最近邻算法,非常好的一篇文章:KNN算法理解;   另外一篇文章也值得参考:KNN最近邻Python实现

    行业应用:  客户流失预测、欺诈侦测等(更适合于稀有事件的分类问题)

    写在前面的:Python2.7    

    数据iris: http://pan.baidu.com/s/1bHuQ0A     测试数据集: iris的第1行数据; 训练数据: iris的2到150行数据

     1 #coding:utf-8
     2 import pandas as pd
     3 import numpy as np
     4 
     5 class KNNa(object):
     6 
     7     #获取训练数据集
     8     def getTrainData(self):
     9         dataSet = pd.read_csv('C:pythonworkpractice_datairis.csv', header=None)
    10         dataSetNP = np.array(dataSet[1:150])
    11         trainData = dataSetNP[:,0:dataSetNP.shape[1]-1]   #获得训练数据
    12         labels = dataSetNP[:,dataSetNP.shape[1]-1]    #获得训练数据类别
    13         return trainData,labels
    14     #得到测试数据的类别
    15     def classify(self, testData, trainData, labels, k):
    16         #计算测试数据与训练数据之间的欧式距离
    17         dist = []
    18         for i in range(len(trainData)):
    19             td = trainData[i,:]   #训练数据
    20             dist.append(np.linalg.norm(testData - td))   #欧式距离
    21         dist_collection = np.array(dist)   #获得所有的欧氏距离,并转换为array类型
    22         dist_index = dist_collection.argsort()[0:k]   #按升序排列,获得前k个下标
    23         k_labels = labels[dist_index]   #获得对应下标的类别
    24 
    25         #计算k个数据中,类别的数目
    26         k_labels = list(k_labels)   #转换为list类型
    27         labels_count = {}
    28         for i in k_labels:
    29             labels_count[i] = k_labels.count(i)  #计算每个类别出现的次数
    30         testData_label = max(labels_count, key=labels_count.get)   #次数出现最多的类别
    31         return testData_label
    32 
    33 
    34 if __name__ == '__main__':
    35     kn = KNNa()
    36     trainData,labels = kn.getTrainData()   #获得训练数据集,iris从第2行到第150行的149条数据
    37     testData = np.array([5.1, 3.5, 1.4, 0.2])   #取iris中的数据的第1行
    38     k = 10   #最近邻数据数目
    39     testData_label = kn.classify(testData,trainData,labels,k)    #获得测试数据的分类类别
    40     print '测试数据的类别:',testData_label

    理论:

  • 相关阅读:
    diamond operator is not supported in -source 1.5
    ClassNotFoundException异常的解决方法
    serialVersionUID 的用途--转加自己的疑问
    java序列化---转
    junit类找不到的问题解决
    FastJson的基本用法----转
    sql字符串查找大小写敏感相关
    6.比较排序之快速排序
    有关ArrayList常用方法的源码解析
    5.比较排序之归并排序(非递归)
  • 原文地址:https://www.cnblogs.com/yiyezhouming/p/7289542.html
Copyright © 2020-2023  润新知