目录
一.判定未知电影的类型
1. 实例解释
以电影分类为例子,使用k-近邻算法分类爱情片和动作片。有人曾经统计过很多电影的打斗镜头和接吻镜头,下图显示了6部电影的打斗和接吻镜头数。 假如有一部未看过的电影,如何确定它是爱情片还是动作片呢?
①首先需要统计这个未知电影存在多少个打斗镜头和接吻镜头,下图中问号位置是该未知电影出现的镜头数
②之后计算未知电影与样本集中其他电影的距离(相似度),具体算法先忽略,结果如下表所示:
③将相似度列表排序,选出前k个最相似的样本。此处我们假设k=3,将上表中的相似度进行排序后前3分别是:He’s Not Really into Dudes,Beautiful Woman,California Man。
④统计最相似样本的分类。此处很容易知道这3个样本均为爱情片。
⑤将分类最多的类别作为未知电影的分类。那么我们就得出结论,未知电影属于爱情片。
2 python代码实现
from numpy import *
import operator
def createDataSet():
'创建数据集'
group=array([[3, 104], [2, 100], [1, 81], [101, 10], [99, 5], [98, 2]])
labels= ['爱情片', '爱情片', '爱情片', '动作片', '动作片', '动作片']
return group, labels
def classify(inX, dataSet, labels, k):
# 获取维度
dataSetSize=dataSet.shape[0] # 训练数据集数量
print("训练数据集数量:")
print(dataSetSize)
diffMat=tile(inX, (dataSetSize, 1))-dataSet # 测试样本的各维度的差值
sqDiffMat=diffMat**2 # 平方计算
sqDistance=sqDiffMat.sum(axis=1) # 输出每行的值
distances=sqDistance**0.5 # 开方计算
print("与未知电影的距离:")
print(distances)
sortedDistances=distances.argsort() # 返回distances中元素从小到大排序后的索引值
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistances[i]]
classCount[voteIlabel]=classCount.get(voteIlabel, 0)+1
sortedClassCount=sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
if __name__ == '__main__':
# 创建数据集
group, labels = createDataSet()
# 测试集
test = [18, 90]
# kNN分类
test_class = classify(test, group, labels, 3)
# 打印分类结果
print("判定未知电影类型:")
print(test_class)