预测电影类型
现有爱情片和动作片(不是爱情动作片,雾)的打斗场面和接吻场面的次数统计,然后给出一个电影打斗场面和接吻场面出现的次数,预测其类型。
那么如何预测呢?当然用KNN了。
KNN算法的原理就是,存在一个训练样本集,我们知道样本集中每一数据与其所属分类的对应关系,然后输入没有标签的新数据,我们可以通过将它的特征与样本集中数据的特征进行比较,提取样本中最相似的分类标签,一般提取前K个,k通常不大于20。简单地说就是计算它与样本集中哪些数据最相似,将抽象的相似性用距离可视化,可计算化,选取前K个最相似的标签。
代码:
from numpy import *
import operator
import matplotlib
import matplotlib.pyplot as plt
#样本训练集
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
#inx:测试集,dataset:训练集,labels:标签,k:选取前k个
def classify0(inx,dataSet,labels,k):
dataSetSize=dataSet.shape[0] #dataset的行数
# tile函数将inx变成datasetsize行,1列的矩阵,做差之后矩阵即为
#[[xi-x0,yi-y0],..[xi-xd,yi-yd]]
diffMat=tile(inx,(dataSetSize,1))-dataSet
#矩阵每个元素都平方
sqDiffMat=diffMat**2
#axis=1表示按行加,0表示按列加
sqDistances=sqDiffMat.sum(axis=1)
#开方求距离
distances=sqDistances**0.5
#argsort()返回数组从小到大的索引值
sortedDistIndicies=distances.argsort()
classCount={}
for i in range(k):
#选取前k个,voteIlbale表示距离从前往后的标签
voteIlbale=labels[sortedDistIndicies[i]]
#统计标签出现的次数
classCount[voteIlbale]=classCount.get(voteIlbale,0)+1
#按照标签出现的次数排序,反向排序
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
#返回出现次数最多的标签
return sortedClassCount[0][0]