KNN算法详解

一些自己的见解,记录下方便日后复习

# encoding:utf-8
from numpy import *
import operator

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


# KNN分类算法函数定义
def KNNClassify(newinput,dataSet,labels,k):
    # 求dataSet的行数
    numSamples = dataSet.shape[0]
    ## 使得输入的newinput变成和dataSet行数一样的数组,方便求newinput到dataSet中每一个点的距离
    # 距离等于 = ((x1-x2)**2 + (y1-y2)**2)**0.5
    # tile([0,0],(2,3))#在行方向重复[0,0] 2次,在在列方向上重复[0,0]3次
    diff = tile(newinput,(numSamples,1))-dataSet
    squaredDiff = diff**2
    # 按行累加
    # axis=0,列表中,每一个列表对应的列相加
    # axis=1,列表中,每一个列表对应的行相加
    squaredDist = squaredDiff.sum(axis=1)
    distance = squaredDist**0.5

    #对距离排序
    #argsort() 将所有值从小到大排序,取原先的索引
    sortedDistlndices = argsort(distance)
    classCount = {}

    for i in range(k):
        '''sortedDistlndices是索引值(所有值从小到大排序的索引值,这里只取前三,也就是选三个点的距离),算出每个索引值对应的labels
        中的值,为A或者B,在classCount中添加A,B的值。并用get()方法累加次数'''
        voteLabel = labels[sortedDistlndices[i]]
        classCount[voteLabel] = classCount.get(voteLabel,0) + 1

    # 第一种方法
    # 这里主要是选出A,B中对应的value谁更大,返回value对应的key(A或者B)这个值
    maxCount = 0
    for key,value in classCount.items():
        if value >maxCount:
            maxCount = value
            maxlndex = key
        return maxlndex


    # # 第二种方法a
    # sortedmp = sorted(classCount.items(), key=operator.itemgetter(1),reverse=True)
    # # 将出现次数较多的情况返回
    # return sortedmp[0][0]


def main():
    group,labels = createDataSet()
    var1 = KNNClassify([1.2,1.0],group,labels,3)
    var2 = KNNClassify([0.2,0.3],group,labels,3)
    print(var1)
    print(var2)

main()





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值