这是一个我认为最累的分类算法
算法思想:我觉得本质就是求两个点之前的距离,所谓用于分类,大概的情形是这样的:加上平面上有两个点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系列不断,其实还有在学习知识图谱,以后估计就是这三个主题吧,这周争取再更新一篇。