python3 sklearn之 knn学习
1,我们给定电影的数据表示如下:
2,问题的数据化:
knn是根据距离的长短进行分类的,通过分类之后我们可以对以后的数据进行判定是属于那种类型,现在我们通过一个实例电影的武打场景次数和接吻场景次数来判定电影是武打片还是爱情片,我们来给定一系列的数据如下所示:
3,算法依赖于求解的路径公式:
4,通过公式分类可以看到如下图结果:
数据如果多的时候分类效果好的话如下图所示:
5,看完上面我们已经已经大致明白了knn的算法实现,现在我们用代码来实现看看,并且给定数据测试一下:
import numpy as np
import operator
def createDataset():
#7组二维特征
group = np.array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2],[18,90]])
#7组对应标签
labels = ('爱情片','爱情片','爱情片','动作片','动作片','动作片','爱情片')
return group,labels
def classify(intX,dataSet,labels,k):
'''
KNN算法
'''
#numpy中shape[0]返回数组的行数,shape[1]返回列数
dataSetSize = dataSet.shape[0]
#将intX在横向重复dataSetSize次,纵向重复1次
#例如intX=([1,2])--->([[1,2],[1,2],[1,2],[1,2]])便于后面计算
diffMat = np.tile(intX,(dataSetSize,1))-dataSet
#二维特征相减后乘方
sqdifMax = diffMat**2
#计算距离
seqDistances = sqdifMax.sum(axis=1)
distances = seqDistances**0.5
print ("distances:",distances)
#返回distance中元素从小到大排序后的索引
sortDistance = distances.argsort()
print ("sortDistance:",sortDistance)
classCount = {}
for i in range(k):
#取出前k个元素的类别
voteLabel = labels[sortDistance[i]]
#print ("第%d个voteLabel=%s",i,voteLabel)
classCount[voteLabel] = classCount.get(voteLabel,0)+1
#dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值。
#计算类别次数
#key=operator.itemgetter(1)根据字典的值进行排序
#key=operator.itemgetter(0)根据字典的键进行排序
#reverse降序排序字典
sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse = True)
#结果sortedClassCount = [('动作片', 2), ('爱情片', 1)]
print ("sortedClassCount:",sortedClassCount)
return sortedClassCount[0][0]
if __name__ == '__main__':
group,labels = createDataset()
test = [20,101]
test1 = [108,19]
test_class = classify(test,group,labels,3)
print (test_class)
test_class1 = classify(test1,group,labels,2)
print (test_class1)
运行结果如下:
还没有评论,来说两句吧...