K近邻(KNN)算法---Python实现(一)

欢迎点击参观我的 ——> 个人学习网站

K近邻算法理论不再多述,点到点距离使用的是欧式距离,即平时数学所学的那个数学公式:√(x₁-x₂)²+(y₁-y₂)² 。

代码如下:

import numpy as np
import operator
from os import listdir
#定义样本点和标签
def creatDataSet():
    group = np.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'A', 'B', 'B']
    return group, labels

def classfy(examplepoint, dataSet, labels, k):
    # 1.计算欧式距离
    dataSetSize = dataSet.shape[0]
    diffMat = np.tile(examplepoint, (dataSetSize, 1)) - dataSet
    sqdistances = (diffMat ** 2).sum(axis=1)
    distances = sqdistances ** 0.5
    # argsort() 是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y。
    # 例如:y=array([3,0,2,1,4,5]) 则,x[3]=-1最小,所以y[0]=3,x[5]=9最大,所以y[5]=5。
    disindex = distances.argsort()

   # 2.选择最小的k个点
    classCount = {}
    for i in range(k):
        temp = labels[disindex[i]] 
        # 第2个参数 key=operator.itemgetter(1) 这个参数的意思是先比较第几个元素
    # 例如:a=[('b',2),('a',1),('c',0)]  b=sorted(a,key=operator.itemgetter(1)) 
    # 结果: b=[('c',0),('a',1),('b',2)] 可以看到排序是按照后边的0,1,2进行排序的,而不是a,b,c
        classCount[temp] = classCount.get(temp, 0) + 1
    sortedClaCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    #sortedClaCount为[('B', 2), ('A', 1)]
    return sortedClaCount[0][0]

def test():
    group, labels = creatDataSet()
    #[0.1, 0.1]为测试点,3为给定的K,大多数经过交差验证而定
    print classfy([0.1, 0.1], group, labels, 3)

if __name__ == '__main__':
    test()

最后输出结果为“B”,意思是测试点归为B类。
(参考很多资料,代码如有雷同请告知)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值