k-近邻算法——电影类型分类

k-近邻算法采用测量不同特征值之间的距离方法进行分类,它的工作原理很好理解。

简单来说就是离x最近的k个点决定了x归为哪一类。
具体点说:

1.假设有一一个带有标签的样本数据集(训练样本集) ,其中包含每条数据与所属分类的对应关系。
2.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较。

  • i.计算新数据与样本数据集中每条数据的距离。
  • il.对求得的所有距离进行排序(从小到大, 越小表示越相似)。
  • il.取前k (k一般小于等于20)个样本数据对应的分类标签。

3.求k个数据中出现次数最多的分类标签作为新数据的分类。

通过一个简单的电影类型分类体会k-近邻算法的工作流程

1.先导入模块和数据,一共七组数据。

from numpy import *
import operator

def createDataSet(): #创建二维数据特征和标签
    group = array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2],[18,90]])
    labels = ['爱情片','爱情片','爱情片','动作片','动作片','动作片','未知']
    return group,labels

2.用knn算法,为每组数据分类,即生成一个分类器。Classify0()函数有四个参数:输入测试集inX、训练集dataSet、分类标签labels,参数k

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]   #获取数据集dataSet的行数
    diffMat = tile(inX, (dataSetSize, 1))- dataSet   #在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向)
    sqDiffMat = diffMat**2      #二维特征相减后平方
    sqDistances = sqDiffMat.sum(axis = 1)    #所有元素相加
    distances = sqDistances**0.5             #开方,计算距离
    sortedDistIndicices = distances.argsort()   #返回distances中的元素从小到大排序后的索引
    classCount = {}    #定义一个记录类别次数的字典

    for i in range(k): 
        voteIlabel = labels[sortedDistIndicices[i]]    #前k个类别
        classCount[voteIlabel] = classCount.get(voteIlabel,0 ) + 1   #字典的get()方法,返回指定键的值
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)     #排序
        #这里python3中用items()替换python2中的iteritems()
        #key=operator.itemgetter(1)根据字典的值进行排序
        #key=operator.itemgetter(0)根据字典的键进行排序
        #reverse降序排序字典
    return sortedClassCount[0][0]  #返回次数最多的类别

距离计算:采用的是欧式距离公式
k-近邻算法——电影类型分类_第1张图片
3. 测试结果

if __name__=="__main__":

    #训练集
    group,labels = createDataSet()
    print(group)
    print(labels)

    #测试集
    test = [100,20]
    test_class = classify0(test, group, labels, 3)
    print(test_class)

输出结果证明点(100,20)被分为动作片:

[[  3 104]
 [  2 100]
 [  1  81]
 [101  10]
 [ 99   5]
 [ 98   2]
 [ 18  90]]
['爱情片', '爱情片', '爱情片', '动作片', '动作片', '动作片', '未知']
动作片

你可能感兴趣的:(#,机器学习实战)