KNN算法实现《机器学习实战》读书笔记(数据分析学习DAY1)

学习的第一个机器学习算法为KNN算法
当然KNN算法可以通过sklearn库直接调用
但还是希望可以通过操作一边记住原理,以及顺便复习一些python的基础函数
本代码并非原创,摘选自《机器学习实战》的代码部分
但由于该书调用了部分python的自带函数
故并非可以一眼看懂,故做此读书笔记,用注释帮助自己理解。

from numpy import*
import operator
def createDataSet():
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group, labels
def classify0(inX, dataSet, labels, k): #inX为需要分类的数据点,dataSet为用于训练的数据集,labels为用于分类的训练集的标签,K为KNN算法中邻居数
    dataSetSize = dataSet.shape[0]#shape[0]返回矩阵的行数,在本场景为返回数具集内的4个数据
    diffMat = tile(inX, (dataSetSize,1))-dataSet#tile在此处的作用为,构建一个每个数据点都与inX相同,且点数与dataSet相同的数据集,相减后用于存放该点与各点不同维度上的距离差
    sqDiffMat = diffMat**2#计算各维度距离的平方
    sqDistances =sqDiffMat.sum(axis=1)#横向加总,即计算平方和,则每一个和代表待分类点到该点的距离
    distances = sqDistances**0.5#开方得到距离
    sortedDistIndicies = distances.argsort()#此函数将distances距离从小到大排列,并且返回的为原来的索引值
    classCount={} #生成字典
    for i in range(k): #得到距离从小打到排名前K个的点的索引
        voteIlabel = labels[sortedDistIndicies[i]] #将排名第i的点的标签放入voteIlabel中
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #get为返回字典中key所对应的值,当不存在时,返回默认值,此处为0. 此部为计算排名前K某一Label的出现个数
    sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse = True) #通过items将字典变为list,可做list输出,operator.itemgetter(1)指用位于1位置的数值。
    return sortedClassCount[0][0]#返回排名第一的0号位值,即排名第一的标签,作为分类结果
group,labels = createDataSet()
classify0([0.7,0.8],group,labels,3)

函数复习

tile
a = [3,2] # 使用tile将a做复制,变成对应shape的矩阵形式
tile (a,(2,2)) # 得到 [[3,2,3,2],[3,2,3,2]]

argsort() #排序并返回索引

get(key, b)# 返回字典对应表key的值,不存在则返回b

dict.item #将字典对象的各键和值对应,返回成一系列 list

总结,KNN算法的思想为
1.计算距离
2.排序
3.取前K名
4.计算前K名各类别的数量
5.按数量将各类别排序
6.选择数量最多的类别

K在0,1分类时取奇数,在多分类时可能会出现排名并列。

本学习笔记纯自用,没有任何参考价值以及正确性保证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值