阿旭机器学习实战【1】K-近邻算法(KNN)模型应用实例,以及图像表征方式

本文涉及的产品
模型训练 PAI-DLC,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: 阿旭机器学习实战【1】K-近邻算法(KNN)模型应用实例,以及图像表征方式

引言


如何进行电影分类


众所周知,电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问题。


没有哪个电影人会说自己制作的电影和以前的某部电影类似,但我们确实知道每部电影在风格 上的确有可能会和同题材的电影相近。那么动作片具有哪些共有特征,使得动作片之间非常类似, 而与爱情片存在着明显的差别呢?


动作片中也会存在接吻镜头,爱情片中也会存在打斗场景,我们不能单纯依靠是否存在打斗或者亲吻来判断影片的类型。但是爱情片中的亲吻镜头更多,动作片中 的打斗场景也更频繁,基于此类场景在某部电影中出现的次数可以用来进行电影分类。


本文介绍的机器学习算法–K-近邻算法(也叫KNN算法),来解决这个类分类问题。


1. k-近邻算法原理


存在一个样本数据集合,即训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。


一般来说,我们只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处,通常K是不大于20的整数。最后 ,选择K个最相似数据中出现次数最多的分类,作为新数据的分类。


那么上面提到的数据之间的相似性如何描述呢?


K-近邻算法采用测量不同特征值之间的距离方法来进行解决的。通常采用的是欧式距离进行计算。取前K个距离最近的数据,然后类别最多的一类胜出。


  • 优点:精度高、对异常值不敏感、无数据输入假定。
  • 缺点:时间复杂度高、空间复杂度高。
  • 适用数据范围:数值型和标称型。


回到引言中电影分类的例子,使用K-近邻算法分类爱情片和动作片。有人曾经统计过很多电影的打斗镜头和接吻镜头,下图显示了6部电影的打斗和接吻次数。假如有一部未看过的电影,如何确定它是爱情片还是动作片呢?我们可以使用K-近邻算法来解决这个问题。

54694b5900244655ad95e321e7034d35.png

首先我们需要知道这个未知电影存在多少个打斗镜头和接吻镜头,上图中问号位置是该未知电影出现的镜头数图形化展示,具体数字参见下表。


3978062491854d2ca462d35515ef7a3d.png


现在假如我们给定一个未知电影分类的打斗镜头与接吻镜头数,我们可以计算得到样本集中所有电影与未知电影的距离,按照距离递增排序,可以找到K个距离最近的电影,然后在这K个电影中最多的分类数即为该电影的类别。


755f9471817e450b952b07c21743dd22.png


假定k=3,计算得到三个最靠近的电影依次是California Man、He’s Not Really into Dudes、Beautiful Woman。K-近邻算法按照距离最近的三部电影的类型,决定未知电影的类型,而这三部电影全是爱情片,因此我们判定未知电影是爱情片。


欧几里得距离(Euclidean Distance)


针对上述不同样本之间的距离计算方式有很多种,其中欧氏距离是最常见的距离度量方式,衡量的是多维空间中各个点之间的绝对距离。公式如下:


245db2730d7a4cd480e8c27dcd88d7ea.png


2. K-近邻算法的步骤


1、我们求未知点到所有样本点的距离

2、对以上求的距离进行排序(从小到大)

3、对排序号的样本点取前K个(注意K值一般不大于20)

4、对这前K个样本的标签进行分析,如果某一样本标签占优势那么未知点就属于该标签的类别


3. k-近邻算法实战–【基于scikit-learn库】


分类问题:from sklearn.neighbors import KNeighborsClassifier


回归问题:from sklearn.neighbors import KNeighborsRegressor


3.1 实战示例1–演示如何使用


根据一个人的身高、体重和鞋子尺码来判断性别

import numpy as np
# 构造特征数据
x = np.array([[172,60,42],
              [168,56,40],
              [189,70,44],
              [160,45,36],
              [163,50,42],
              [170,65,41]])
# 给上面的特征数据加标签
y = np.array(["男","女","男","女","男","女"])
# 构造一组未知的特征数据,用于后续预测
x_test = np.array([[175,75,43],[170,60,38],[165,50,40]])
# 导入相关的算法
from sklearn.neighbors import KNeighborsClassifier
# 1、创建算法模型,k-近邻分类器模型:n_neighbors代表k-近邻算法取的前k个邻居,默认为5,一般不超过20
knn = KNeighborsClassifier(n_neighbors=3)
# 2、用创建好的算法模型,取对已有的数据进行训练:在k-近邻里面,训练过程就是告诉knn对象,x里面的数据对应到y中代表谁
knn.fit(x,y)
# 3、根据已有的数据基础对未知的数据进行预测
# 分别拿x_test中的每一条数据和已知数据进行k-近邻运算,进而推测出每一条数据分类归属
knn.predict(x_test)
# 我们可以看到,依据该算法预测出的3组数据结果为['男', '女', '女']。
# 4、性能检测
# 此处由于未设置测试数据的标签,因此无法性能检测


预测输出的结果为:array(['男', '女', '女'], dtype='<U1')
• 1


3.2 实战示例2–鸢尾花分类


导入数据集并查看形状


# 导入sklearn的官方数据库
from sklearn import datasets
iris = datasets.load_iris()
# 提取出特征数据
data = iris.data
# 提取标签数据
target = iris.target
print(data.shape)
print(target.shape)
(150, 4)
(150,)
• 1
• 2
target
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])


数据形状为:(150, 4),说明该数据集有150条数据,每条数据包含4个特征

通过打印出的标签数据,我们可以看到该标签分为3个类别:0,1,2


模型训练及预测过程


# 切分数据:将数据分为训练集和测试集,使用train_test_split方法
from sklearn.model_selection import train_test_split
# rain_test_split方法首先会把data和target随机打乱,提取出给出比例的数据(包括特征和标签)作为测试数据,下面使用的10%数据作为测试集
x_train, x_test, y_train, y_test = train_test_split(data,target,test_size=0.1)
# 创建模型
knn = KNeighborsClassifier(n_neighbors=5)
# 训练
knn.fit(x_train,y_train)
# 预测:y_为预测出的结果
y_ = knn.predict(x_test)
# 性能评测:查看准确率
knn.score(x_test,y_test)


1.0
• 1


我们可以看到模型预测出的结果准确率为100%。


用图像表征分类的过程


由于4个特征用二维图像无法表述,因此我们取前两个特征,来进行图像分类过程表述,仅用于演示分类的过程


# 取前两个特征
x_train = data[:,:2]
x_train.shape
(150, 2)
import matplotlib.pyplot as plt
import numpy as np
# 画出这150个样本对应标签的散点图
plt.scatter(x_train[:,0],x_train[:,1],c=target)
plt.show()

26ffec7d417a4555b0dfccc363cd7384.png


上图中的水平与竖直坐标表征鸢尾花数据集中的前两个特征,3种颜色的散点代表着鸢尾花的3种分类


下面我们通过KNN模型,把整个平面中所有的点根据KNN模型来划分所属类别,确定他们的范围区域。


# 测试数据是平面上所有的点(取150000个点),300*500个点:水平:500,竖直:300
# 找所有样本点的最小值和最大值,以确定坐标区域范围
xmin,xmax = x_train[:,0].min(),x_train[:,0].max()
ymin,ymax = x_train[:,1].min(),x_train[:,1].max()
# 切分,水平分500等份,竖直分300等份
x = np.linspace(xmin,xmax,500)
y = np.linspace(ymin,ymax,300)
# 把x和y组合
xx,yy = np.meshgrid(x,y)
# yy.ravel()
# 将300*500个点的坐标当做需要预测的样本,赋值给x_test
x_test =  np.c_[xx.ravel(),yy.ravel()]


x_test.shape


(150000, 2)


x_test[:5]


array([[4.3       , 2.        ],
       [4.30721443, 2.        ],
       [4.31442886, 2.        ],
       [4.32164329, 2.        ],
       [4.32885772, 2.        ]])


x_test


array([[4.3       , 2.        ],
       [4.30721443, 2.        ],
       [4.31442886, 2.        ],
       ...,
       [7.88557114, 4.4       ],
       [7.89278557, 4.4       ],
       [7.9       , 4.4       ]])


# 画出需要进行预测的15000一个样本点
plt.scatter(x_test[:,0],x_test[:,1])

72eb889ef7cf40d7b36f904b1e88058b.png

# 创建模型
knn = KNeighborsClassifier()
# 训练
knn.fit(x_train,target)
# 预测
y_ = knn.predict(x_test)
plt.scatter(x_test[:,0],x_test[:,1],c=y_)
plt.scatter(x_train[:,0],x_train[:,1],c=target,cmap="rainbow")

3713747a018247a49c88f8c308781aa8.png


通过上图我们可以很清楚的看到平面上15000个测试样本点各自所在的类别,即3种类别的鸢尾花在平面上的区域范围。


模型准确率:

# 通过训练出的模型对训练数据进行预测,得到预测准确率为83%
knn.score(x_train,target)


输出结果:0.83333333333333337


总结


本文主要介绍了以下几点内容:


  • 机器学习中K-近邻算法的原理,
  • K-近邻算法的使用步骤
  • 依据鸢尾花分类问题,详细介绍了K-近邻算法的使用。同时用图像的方式对分类过程进行了描述。





相关文章
|
24天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
68 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
24天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
68 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
1月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
32 0
|
1月前
|
机器学习/深度学习 人工智能 算法
青否数字人声音克隆算法升级,16个超真实直播声音模型免费送!
青否数字人的声音克隆算法全面升级,能够完美克隆真人的音调、语速、情感和呼吸。提供16种超真实的直播声音模型,支持3大AI直播类型和6大核心AIGC技术,60秒快速开播,助力商家轻松赚钱。AI讲品、互动和售卖功能强大,支持多平台直播,确保每场直播话术不重复,智能互动和真实感十足。新手小白也能轻松上手,有效规避违规风险。
|
1月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
1月前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
79 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
1月前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的决策树算法
【10月更文挑战第29天】本文将深入浅出地介绍决策树算法,一种在机器学习中广泛使用的分类和回归方法。我们将从基础概念出发,逐步深入到算法的实际应用,最后通过一个代码示例来直观展示如何利用决策树解决实际问题。无论你是机器学习的初学者还是希望深化理解的开发者,这篇文章都将为你提供有价值的见解和指导。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
阿里云人工智能平台 PAI 团队发表的图像编辑算法论文在 MM2024 上正式亮相发表。ACM MM(ACM国际多媒体会议)是国际多媒体领域的顶级会议,旨在为研究人员、工程师和行业专家提供一个交流平台,以展示在多媒体领域的最新研究成果、技术进展和应用案例。其主题涵盖了图像处理、视频分析、音频处理、社交媒体和多媒体系统等广泛领域。此次入选标志着阿里云人工智能平台 PAI 在图像编辑算法方面的研究获得了学术界的充分认可。
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
|
2月前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
2月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能

热门文章

最新文章

相关产品

  • 人工智能平台 PAI