机器学习实战——KNN算法预测电影类型

 预测电影类型

    现有爱情片和动作片(不是爱情动作片,雾)的打斗场面和接吻场面的次数统计,然后给出一个电影打斗场面和接吻场面出现的次数,预测其类型。

机器学习实战——KNN算法预测电影类型_第1张图片

那么如何预测呢?当然用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]

你可能感兴趣的