K-近邻算法

K-近邻算法(KNN),它是非常有效且易于掌握的算法。简单地说,k-近邻算法采用测量不同特征值之间的距离方法进行分类。


优点:精度高、对异常值不敏感、无数据输入假定。

缺点:计算复杂度高、空间复杂度高,分类时间复杂度是O(n)。

适用数据范围:数值型和标称型。


对于未知类别属性数据集中的点:

1、计算已知类别数据集中的点与当前点的距离

2、按照距离依次排序

3、选取与当前点距离最小的k个点

4、确定前k个点所在类别出现的概率

5、返回前k个点出现频率最高的类别作为当前点的预测分类


在样本不平衡时,可以通过设置权重进行控制。


一个简单的demo:

#-*- coding: utf-8 -*
import numpy as np
import operator

def createDataSet(): # 创建数据集
    group = np.array([[1.0,1.1],[1.0,1.0],[0.0,0.0],[0,0.1]])
    labels = ['A','A','B','B']
    return group,labels # group和labels的值

def classify0(inX,dataSet,labels,k): # inX待分类的点 , dataSet数据集 , labels类别标签 , k跟几个进行比对
    dataSetSize = dataSet.shape[0] # shape维度 , shape[0]代表矩阵有多少行,表示dataSet有多少样本
    diffMat = np.tile(inX, (dataSetSize,1)) - dataSet # 计算距离 ,tile复制样本inX , 和数据集里面的值相减 ,返回的值为一个矩阵
    sqDiffMat = diffMat ** 2 # 求平方值
    sqDistances = sqDiffMat.sum(axis = 1) # 每一行记录的值求和
    distance = sqDistances **0.5 # 开方,是与所有点距离的值,代表一个矩阵
    sortedDistIndicies = distance.argsort() # 对distance进行一个排序
    classCount = {}
    for i in range(k): # 对k个样本遍历
        voteLabel = labels[sortedDistIndicies[i]] # 当前最近那个点
        classCount[voteLabel] = classCount.get(voteLabel,0) + 1 # 计算有多少个,classCount是一个字典
    sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) # 排序 (reverse=True 倒序)
    return sortedClassCount[0][0] # sortedClassCount[排在第一的那个点][是A还是B]

if __name__ == '__main__':
     group,labels = createDataSet()
     test = classify0([3,3],group,labels,3)
     print test

这个是判断某一个点更接近于A还是B。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值