Python之KNN算法

KNN分类算法

1.优缺点

优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度高
适用数据范围:数值型和标称型

2.k近邻算法

如图:X周围最近有5个邻居(距离),其中4个是W1,1个W3,所以判定X是W1类别

3.实现KNN算法

对未知类别属性的数据集中的每个点依次进行以下操作:
1.计算已知类别数据集中的点与未知点之间的距离
2.按照距离递增次序排列
3.选取与未知点距离最小的K个点
4.确定前k个点所在类别出现的频率
5.返回前k个点出现频率最高的类别作为未知点的预测分类
注:通常采用交叉验证方法选取最佳的K值

4.代码实现

# trainData  训练集
# textData   测试集
# labels     分类

import  numpy as np
import operator
def  KNN(trainData,textData,labels,k):
    rowSize = trainData.shape[0]  #计算训练集的行数
    diff = np.tile(textData,(rowSize,1)) - trainData  #计算训练样本和测试样本的差值   
   # np.tile(testData, (rowSize, 1)) 是将 testData 这个数据扩展为 rowSize 列,这样能避免运算错误
    distance = ((diff ** 2).sum(axis=1))** 0.5  #计算距离
    sortdistance = distance.argsort() #对所得距离升序排列
    
    count = {}
    for i in range(k):
        vote = labels[sortdistance[i]]
        count[vote] = count.get(vote,0) +1
        sortcount = sorted(count.items(),key=operator.itemgetter(1),reverse = True)  #对类别出现的频数降序排序
        #sorted(count.items(), key=operator.itemgetter(1), reverse=True) 排序函数,里面的参数 key=operator.itemgetter(1), reverse=True 表示按照 count 这个字典的值(value)从高到低排序,如果把 1 换成 0,则是按字典的键(key)从高到低排序。把 True 换成 False 则是从低到高排序
        return sortcount[0][0] #返回频数最高的类别

trainData = np.array([[1,2],[5,3.6],[7,6.2],[11,9.6],[12,10.5]])
labels = ["爱情片","爱情片","悬疑片","悬疑片","悬疑片"]
textData1 =[4,3.6]
textData2 =[10,9.2]
X1 = KNN(trainData,textData1,labels,3)
X2 = KNN(trainData,textData2,labels,3)
print(X1)
print(X2)

看一眼运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值