赞
踩
如何进行电影分类
众所周知,电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪
个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问
题。没有哪个电影人会说自己制作的电影和以前的某部电影类似,但我们确实知道每部电影在风格
上的确有可能会和同题材的电影相近。那么动作片具有哪些共有特征,使得动作片之间非常类似,
而与爱情片存在着明显的差别呢?动作片中也会存在接吻镜头,爱情片中也会存在打斗场景,我们
不能单纯依靠是否存在打斗或者亲吻来判断影片的类型。但是爱情片中的亲吻镜头更多,动作片中
的打斗场景也更频繁,基于此类场景在某部电影中出现的次数可以用来进行电影分类。
介绍第一个机器学习算法:K-近邻算法,它非常有效而且易于掌握。
简单地说,K-近邻算法采用测量不同特征值之间的距离方法进行分类。
优点:精度高、对异常值不敏感、无数据输入假定。
缺点:时间复杂度高、空间复杂度高。
适用数据范围:数值型和标称型。
存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们 只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处,通常K是不大于20的整数。 最后 ,选择K个最相似数据中出现次数最多的分类,作为新数据的分类。
回到前面电影分类的例子,使用K-近邻算法分类爱情片和动作片。有人曾经统计过很多电影的打斗镜头和接吻镜头,下图显示了6部电影的打斗和接吻次数。假如有一部未看过的电影,如何确定它是爱情片还是动作片呢?我们可以使用K-近邻算法来解决这个问题。
首先我们需要知道这个未知电影存在多少个打斗镜头和接吻镜头,上图中问号位置是该未知电影出现的镜头数图形化展示,具体数字参见下表。
即使不知道未知电影属于哪种类型,我们也可以通过某种方法计算出来。首先计算未知电影与样本集中其他电影的距离,如图所示。
现在我们得到了样本集中所有电影与未知电影的距离,按照距离递增排序,可以找到K个距 离最近的电影。假定k=3,则三个最靠近的电影依次是California Man、He’s Not Really into Dudes、Beautiful Woman。K-近邻算法按照距离最近的三部电影的类型,决定未知电影的类型,而这三部电影全是爱情片,因此我们判定未知电影是爱情片。
欧氏距离是最常见的距离度量,衡量的是多维空间中各个点之间的绝对距离。公式如下:
K-近邻算法的步骤:
1、我们求未知点到所有样本点的距离
2、对以上求的距离进行排序(从小到大)
3、对排序号的样本点取前K个(注意K值一般不大于20)
4、对这前K个样本的标签进行分析,如果某一样本标签占优势那么未知点就属于该标签的类别
模块安装
pip install sklearn
# 如果安装太慢,使用国内镜像源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sklearn
sklearn,全称sciket-learn,它是一个机器学习的基本框架,这个框架里面集成所有的经典机器学习
算法以及神经网络的一些算法;还一些案例数据在这里也有体现
分类问题:from sklearn.neighbors import KNeighborsClassifier
回归问题:from sklearn.neighbors import KNeighborsRegressor
根据身高、体重和鞋子尺码来判断性别
- 首先导入numpy,创建一个数组,存放这些信息
导入k-近邻模型
from sklearn.neighbors import KNeighborsClassifier
# neighbors是一个程序包,包含了基于距离邻居与的所有的算法
# KNeighborsClassifier是knn的分类算法模型,用于处理分类问题
- 创建k-近邻分类模型对象
n_neighbors参数,就是knn算法中的那个K,用于规定取前K个最近的邻居进行考察
n_jobs参数,代表当前算法模型运行在多少个内核上
- 训练算法
这个训练的过程即是告诉模型,我们那些特征向量对用了哪些标签
- 预测,把未知数据放入到knn训练好的对象中进行knn预测
预测的过程:
1)分别拿x_test中的每一个特征向量,和已知的所有的特征向量求距离
2)对以上的 距离进行从小到大排序
3)k=3取前3个最小的距离,考察期标签 最终决定未知数据的类别归属
性能评测
这个准确率是通过训练数据(已知数据),我们用data和target这组数据来对knn进行的训练,现在我们又拿出这些数据进行性能评测,此时得到的评测结果叫做经验集性能
这个准确率叫做经验准确率
以上的性能评测是在训练集上进行的,即我们用data和target这个数据集进行的knn模型训练,然后我们又让knn模型在这个数据集上进行性能评测,这个性能是经验性能,这个性能只能说明knn模型对已知数据的性能体现和预测能力,那么对于未知数据呢?这个模型的性能就未必表现的良好
# 导入sklearn的数据库
from sklearn import datasets
iris 英文叫鸢尾花,为什么叫鸢尾花呢?这个不用细究,了解一下结构就行
看一下数据
从datasets中获取鸢尾花数据
datasets中提供的数据集,data属性代表特征数据,target属性代表标签数据
训练集和测试集:
在进行训练的时候,希望训练集的训练的性能尽可能的高,如果用同一个样本集既进行训练,又进行测试,那么评测出来的性能只是代表在训练集上的性能,不能代表它在一个未知的新的样本集上是否也能性能良好,即模型的经验性能不能代表模型的泛化能力(预测能力)
在性能评测的时候既要评测经验性能,又要评测泛化性能,需要再有一个新的数据集(包括其特征和标签),在训练完以后,在新的数据集上进行性能评测,此时评测出来的性能叫做泛化性能(预测能力)
- 将上面的data和target一部分数据,拿出来作为训练,另一部分作为测试,
作为测试的那部分,不参与到训练中去,只是作为测试数据来评测模型的泛化性能
导入模块分离测试数据和训练数据
from sklearn.model_selection import train_test_split
取出20%的数据作为测试数据
返回值有4个数组,返回值分别代表 训练特征、测试特征、训练标签、测试标签
分别用四个变量接收
将n_neighbors暂且取为10
进行性能评测
对于KNN算法,能够影响其性能的参数为n_neighbors,n_neighbors调优方案:样本量小可以取1-20之间的数,样本量大可以取1到训练数据量的平方根;尽可能取大的调优范围
- 确定 k 的调优范围
查看训练集x_train
x_train 有120条数据
确定 k 的调优范围
10.95…调优范围有两个,1-11或者1-20,选取1-20这个范围进行调优
- 进行调优 提取最大准确率对应的算法模型
生成一个列表,存放k的可取值
依次进行调优,提取最大准确率对应的算法模型
查看一下打印的内容
查看最优泛化准确率和最优k值
人类动作识别
步行,上楼,下楼,坐着,站立和躺着
数据采集每个人在腰部穿着智能手机,进行了六个活动(步行,上楼,下楼,坐着,站立和躺着)。采用嵌入式加速度计和陀螺仪,以50Hz的恒定速度捕获3轴线性加速度和3轴角速度,来获取数据
这些是数据
查看数据
总共采取了7352条数据作为训练集,每个动作561个特征(每做一个动作,陀螺仪等仪器捕捉到561个特征)
这些对应动作的序号,0~5对应六个活动(步行,上楼,下楼,坐着,站立和躺着)
- 创建knn模型和训练
- 经验性能和泛化性能
由于数据比较多,运算起来会比较慢
和上面的调优步骤一样
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。