机器学习13_KNN算法(2021.05.26)
![by demo](https://i-blog.csdnimg.cn/blog_migrate/82dc2c480ba35451a2b302e3d6f01b48.png)
一. 解惑
- KNN算法的全名是什么?
KNN算法(K-NearestNeighbor)也称邻近算法,或者说K最近邻分类算法,该算法是数据挖掘分类技术中最简单的方法之一。 - 什么是KNN算法?
KNN算法其实就是根据数据之间的相似度来进行分类。简单地说,KNN算法通过测量待分类目标与已知分类目标之间的距离来进行分类。(近朱者赤近墨者黑) - 待分类的目标到已知分类目标之间的距离是怎样计算的呢?
使用欧几里得距离公式,将每个待分类目标的每个特征值和已知分类目标的每个特征值当作各自的坐标,从而根据每个相对应的特征值而算出待分类目标与已知分类目标之间的距离。·
欧几里得公式:点此查看 - KNN算法中的K值又是什么?
在计算完待分类目标与全部已知分类目标之间的距离之后,就需要来选取哪些已知分类的目标作为分类参考了。K值其实就是用于选出待分类的目标的周围有几个已知分类的邻居,之后再根据这k个邻居中,相应的分类情况的占比来判断待分类目标的分类情况。(注:K值选取的不同将会导致KNN分类结果的不同,如下图所示,实线部分K的值就为3,圆的分类将被划分为三角;虚线部分K的值就为5,而圆的分类将会被划分为方块。)
![by demo](https://i-blog.csdnimg.cn/blog_migrate/748d33a4be45b3ec4d9eb3e743ee0c03.png)
二. 举个例子让你更轻松地理解KNN — 如何使用KNN对电影的类别进行分类
- 前提:这个例子只是简单地根据打斗镜头的数量和亲吻镜头的数量将电影分为了动作电影和爱情电影两类。
- 问题点:对于动作片来说,动作片有哪些共有的特征,使得动作片之间非常类似,而与爱情片存在着明显的差别呢?相反来说,对于爱情片,是有哪些特征,使得爱情片之间非常类似,而与动作片存在着明显的差别呢?
- 答案:其实就是 – 打斗镜头和亲吻镜头的出现的数量! 也就是说,动作片有着更多的打斗镜头,而爱情片则有着更多的亲吻镜头。因此,根矩这两种镜头的数量貌似可以将电影进行一次简单地分类。
也就是可以将亲吻镜头数量和打斗镜头数量分别作为x轴和y轴,根据电影中亲吻镜头和打斗镜头出现的次数,可以将每一部电影放入到该二维坐标系中(详见下图)有了这些点之后,当一部未知分类的电影想要进行分类时,就可以按照这部电影的打斗镜头出现次数和亲吻镜头出现次数将其也放入之前建好的二维坐标系中,在这之后再与已知类型的电影的坐标求距离,根据距离的远近,以及根据K值大小选取邻居的数量,以及K个邻居中的电影分类比例,就可以大致推断出想要分类的电影的类型。 - 图解:
1. 提取出已知分类电影中的亲吻、打斗镜头的次数
![by demo](https://i-blog.csdnimg.cn/blog_migrate/b1c5d3fbaaea0dbdb5c6b8bab4b98686.png)
2..将每一部电影根据其亲吻和打斗镜头出现的次数写入坐标系中。
![by demo](https://i-blog.csdnimg.cn/blog_migrate/facb5123344e971f9bdd56bf8a4a57de.png)
3. 计算待分类电影到已分类电影坐标点之间的距离
![by demo](https://i-blog.csdnimg.cn/blog_migrate/b517cc43973707c2703c996ec9035cfb.png)
4. 假设定义K的值为3,根据坐标之间的距离可以轻松地判断出电影《?》的分类为爱情电影。
三. 代码实现真实示例(鸢尾花的分类)中使用KNN算法
import sklearn.datasets as datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
feature = iris['data']
target = iris['target']
x_train, x_test, y_train, y_test = train_test_split(feature, target, test_size=0.2, random_state=2021)
print(x_train)
knn = KNeighborsClassifier(n_neighbors=3)
knn = knn.fit(x_train, y_train)
print(knn)
y_pred = knn.predict(x_test)
y_true = y_test
print('模型的分类结果:', y_pred)
print('真实的分类结果:', y_true)
print(knn.score(x_test, y_test))
test1 = knn.predict([[6.1, 3.1, 4.7, 2.1]])
print(test1)
如有问题,敬请指正。欢迎转载,但请注明出处。