机器学习算法之KNN

1 篇文章 0 订阅
1 篇文章 0 订阅

这是一个我认为最累的分类算法

算法思想:我觉得本质就是求两个点之前的距离,所谓用于分类,大概的情形是这样的:加上平面上有两个点A(0,0)和B(2,2),现在有第三个 点(1,0),判断这个点是离A近点还是离B更近点,用的就是两点间距离公式,分别算出到AB两个点间的距离,算下来离A更近,所以(1,0)就分算作是A类点(逻辑不严谨,从A点到A类点,大概是这么个意思),这就算是分类完成了。既然是分类,这个A类点应该不能只有一个,否则感觉就是个例,所以这里的A类点和B类点应该是一些点的集合,然后算法就变成计算和A,B两类点的所有点的距离,然后按距离由近到远排序,假设取距离最近的前三个点,如果有两个是A类的点,一个是B类的点,则认为这个点是属于A类点,这样分类就完成了,这里的3就是KNN的K,你们懂得,也就是最后来了一次投票选举,少数服从多数。这就要求样本的数据必须就严格划分好的,否则极端的几个个例就直接影响了结果,因为排名靠前的权力有点大哈。我觉得最累的原因是每次来一个数据,所有的距离都需要重新计算,当样本数据集很大的时候,计算量肯定很大。

想到个一句话描述这个算法,那就是:近朱者赤近墨者黑,大概就是和这个差不多的原理吧。


接下来是代码实现,仅供参考。

from numpy import array,tile
import operator
def creatData():
    data = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return data,labels

def kNN0(nums,data,labels,k):
# print(data)
    dsize = data.shape[0]
    new = tile(nums,(dsize,1))
    print(new-data)

    result = (new-data)**2
    result.sum(axis=1)
    print(result)
    distence = result.sum(axis=1) ** 0.5
    print(result.sum(axis=1)**0.5)
    sortDis = distence.argsort()
    print(sortDis)
    classCount = {}
    for i in range(k):
        print(sortDis[i])
        votellabel = labels[sortDis[i]]
        classCount[votellabel] = classCount.get(votellabel,0)+1
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]


if __name__ =="__main__":
    data, labels = creatData()
    re = kNN0([0,0],data,labels,2)
    print(re)

这是很简单的实现,我是从书本原封不动的抄过来的,确实很多API不知道,很多函数不知道怎么用,通过查询函数的用法和打印看结果你大概也了解了,之前自己就已经对这书本抄过一遍,但是这一遍自己写还是觉得不知道用什么函数,还是要看书本,可能有个答案在那吧,以后还是先读懂算法,然后自己实现,再和书本对照吧,肯定可以收获的更多。
谈谈自己对python数据处理的理解,python之所以用于大数据的处理和计算,不仅仅是因为很多引用库是用高效的C实现的,更重要的是使用矩阵这个工具,进行的是批量的操作,我觉得能够理解的这个,后面的操作会好理解很多。

一直想写点表达自己真实想法的东西,但是写出来东西感觉还是可读性不高,了无趣味,有种提笔忘字的感觉,可能是自己的还是太过急躁了,积累不够,本来是决定周更的,上周完成了TensorFlow的mnist字体的识别,但是被卡在了tensorBoard图形化那里,周末都玩去了,还赶上LOL的比赛,没能更新,后面争取tf系列更新不断,ML系列不断,其实还有在学习知识图谱,以后估计就是这三个主题吧,这周争取再更新一篇。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值