您的位置:首页 > 编程语言 > Python开发

最简单的K近邻算法 KNN python实现

2017-10-05 16:13 381 查看
这是一个最简单的KNN 算法实现

题目来源于<机器学习实战>

1,首先,必须熟悉Numpy的几个常用函数,都是关于矩阵运算的

1.0 首先,我们使用这种方式来构建一个矩阵:

matrixA =  array( [ 

[1,  2.5,   3],

[2,  3,   9.9],

                        ])

1.1  shape 

    用来求取矩阵的行,列数 

       matrixA.shape  将得到 (2,3) 意为2行,3列;

      matrixA.shape[0] 将得到 2, 意为 2行

     matrixA.shape[1]  将得到 3, 意为 3列

1.2  tile 

tile(matrixA, (2,1))  求得 matrixA 的扩充矩阵, 扩充的方法,由后面的(2,1)指定; 2指定按行扩充倍数, 1指定按列扩充倍数

------------------------------------(2 ,2) -------------------------------------->   [    [ 1, 2.5, 3 , 1, 2.5, 3 ]

[      [1,  2.5,   3]              (2,1)------>     [ [1, 2.5, 3]                                    [ 2, 3,  9.9   2, 3, 9.9 ]

[2,  3,   9.9]                                            [  2, 3, 9.9]                                     [ 1, 2.5, 3 , 1, 2.5, 3 ]

                 ]                                               [1, 2.5, 3]                                     [ 2, 3,  9.9   2, 3, 9.9 ]

                                                                  [2, 3, 9.9 ] ]                                ]

1.3  sum 

sum(matrixA, axis=0)               将矩阵按行向量相加, 得到单行矩阵  [ 3, 5.5, 12.9]

       sum(matrixA, axis =1)              将矩阵按列向量相加,并把得到的单列矩阵转置为单行矩阵 [ 6.5, 14.9] 

1.4 argsort 

      argsort(dis)      对单行矩阵排序,得到一个由小到大排序后的序号;  

如 argsort(array([2, 4, 3, 1])) 得到  [ 3, 0, 2, 1]  注意这里保存的是序号值. 本身的值并没有挪动.

 2. 现在进入算法

   2.1 定义一个数据集, 这个作为计算距离使用的邻近点,必须是:

1) 各向量值已知的

2) 已经分类的,  分类标签保存在 labels中.

3) 这个数据集的数量需要自行控制

def createDataSet():

    group = array([

        [1.0,0.9],

        [1.0,1.0],

        [0.1,0.2],

        [0.0,0.1]

        ])

    labels = ['A', 'A','B', 'B']

    return group, labels

2.2 正式的分类计算 

    1, 取出数据向量(一行),构建一个扩充矩阵扩充到数据集的行数那么多.

   2, 两个矩阵相减, 并且各分量平方运算. 

   3, 按列相加, 这样就得到待分类点与邻居点的距离平方

   4, 求方根.得到距离

   5, 距离排序, 取最小的K个值

  6, 统计这K个值都是什么标签类型的,统计数最多的选定为 本对象的分类

   #knn 算法, 

  # newinput: 输入待分类数据

 # dataSet, labels已构建好的数据集和标签

#K 选择多少个距离最近的邻近点作为参考

def KnnClass(newInput, dataSet, labels, k):
vetors=dataSet.shape[0]  #取矩阵的行数

#title 根据输入矩阵,新建一个扩充矩阵,行列数由(nvetors,1)决定多行,单列
#[1,2] --(2,1)--> [1,2]
#[3,4]            [3,4]
#                 [1,2]
#                 [3,4]
diff = tile(newInput, (vetors,1)) - dataSet #和数据集向量求差
squDiff= diff ** 2                           #求差后向量平方
squDist = sum(squDiff, axis =1)              # 按列相加求和,并转置成行 axis=0,则是按行相加
dis = squDist ** 0.5                         #各列向量分别求平方根

sortedDistInd = argsort(dis)                #索引排序,值最小的在前
classCount = {}

#取出距离最小的邻居点,找到标签给它计数
for i in xrange(k):
voteLabel = labels[sortedDistInd[i]]
classCount[voteLabel] = classCount.get(voteLabel,0) + 1

#从已经计算的K个邻近点标签中选出出现最多次数的
maxCount = 0
for key, value in classCount.items():
if value > maxCount:
maxCount = value
maxIndex = key
return maxIndex
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息