python之KNN算法的简单实现

KNN算法又称k近邻分类(k-nearest neighbor classification)算法。它是一种有监督学习,它是根据不同特征值之间的距离来进行分类的一种简单的机器学习方法。

算法介绍网上很多,我也是参考网上的描述,下面有一个python实现的简单knn算法

大体描述:
事先有样本数据,每个数据都有标签,然后拿一个未知样本,让程序判断它属于什么标签类别。

基本思想就是:
根据未知样本的分布,计算它到各个已知样本的距离,取距离未知样本为K的所有已知样本点并且对样本的标签进行统计排序,如果在这个K个范围标签数量最多的为A类型,那么就认为这个未知样本的分类为A

具体算法如下(参考的网上的,自己添加了注释):

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# @Time    : 17/11/15 下午11:44
# @Author  : lijie
# @File    : myknn01.py

import operator
import numpy


##创建模拟样本和类别标签
def createDataSet():
    sample = ([[175, 50], [160, 70], [170, 90], [165, 60], [165, 50], [180, 100], [180, 65]])
    labels = ["s", "f", "f", "s", "s", "f", "s"]
    return numpy.array(sample), labels


##knn
def samplePross(inX, dataSet, labels, k):
    # 获取行数这里总共7行
    # 打印出7
    dataSetSize = dataSet.shape[0]

    # 将需要分类的数据纵向增加7行和样本数据做减法
    # [[5   20]
    # [20    0]
    # [10  -20]
    # [15   10]
    # [15   20]
    # [0   -30]
    # [0     5]]
    diffMat = numpy.tile(inX, (dataSetSize, 1)) - dataSet

    # 对上面的矩阵内部的所有数做平方运算
    # [[25 400]
    # [400   0]
    # [100 400]
    # [225 100]
    # [225 400]
    # [0   900]
    # [0   25]]
    sqDiffMat = diffMat ** 2

    # 对上一行代码返回的矩阵做横向相加
    # [425 400 500 325 625 900  25]
    sqDistances = sqDiffMat.sum(axis=1)

    # 对上面的一位矩阵所有元素做开平方根
    # [20.61552813  20    22.36067977  18.02775638  25      30     5]
    distances = sqDistances ** 0.5

    # 对距离进行参数排序从小到大的下标
    # [6 3 1 0 2 4 5]
    sortedDistIndicies = distances.argsort()

    classCount = {}
    for i in range(k):

        #取出来最近的k个值
        voteIlabel = labels[sortedDistIndicies[i]]

        #当字典classCount有标签就取出标签加1 没有就为0 然后再放回
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1

    #对上面已经计算完成的classCount的value排序(key=operator.itemgetter(1)表示取map的value)
    # classCount.iteritems()为sorted函数参数需要的迭代器,
    #默认从小到大 reverse=True 即从大到小
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)

    #返回出现次数最多的一个label
    return sortedClassCount[0][0]


# 分类测试
sample, labels = createDataSet()
print samplePross([180, 70], sample, labels, 3)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值