KNN和Kmeans算法是数据分析、机器学习中两个比较重要的算法。对于初学者可能会混淆,这篇文章力求最通俗的话解释这两个算法。
- 一、初识算法
- 1.1 KNN算法
- 1.2 KMeans算法
- 1.3 KNN和Kmeans总结
- 二、算法思想
- 2.1 KNN原理、实现过程
- 2.2 KNN算法实例讲解
- 2.3 KMeans原理、实现过程
- 2.4 KMeans算法实例讲解
- 三、算法编程
- 3.1 KNN算法编程
- 3.2 KMeans算法编程
一、初识算法
1.1 KNN算法:
它是监督学习中的一种分类算法,换句话说:喂给该算法模型都是带label的数据。
为了方便理解,我虚构如下KNN数据集:
注:其中黄色标注为数据的特征,红色标注为数据集的label。
该数据的电影类型部分未知,即该数据部分label未知,我们需要通过KNN算法得出这些未知Label。
1.2 KMeans算法:
它是非监督学习中一种聚类算法,换句话说:喂给该算法模型都是无label的数据,杂乱无章的。
为了方便理解,我也同样构造了Kmeans数据集:
该数据的电影类型都未知,即该数据label都未知,我们需要通过Kmeans算法得出他们label。
1.3 KNN和Kmeans总结
两种算法之间的根本区别是:
KNN属于监督学习,类别是已知的,通过对已知分类的数据进行训练和学习,找到这些不同类的特征,再对未分类的数据进行分类。
Kmeans属于非监督学习,事先不知道数据会分为几类,通过聚类分析将数据聚合成几个群体。聚类不需要对数据进行训练和学习。
二、算法思想
2.1 KNN原理、实现过程
KKN原理:
KNN算法最简单粗暴的就是将预测点与所有点距离进行计算,然后保存并排序,选出前面K个值看看哪些类别比较多,则预测的点属于哪类。
KNN过程:
对未知类别属性的数据集中的每个点依次执行以下操作:
(1) 计算已知类别数据集中的点与当前点之间的距离;
(2) 按照距离递增次序排序;
(3) 选取与当前点距离最小的k个点;
(4) 确定前k个点所在类别的出现频率;
(5) 返回前k个点出现频率最高的类别作为当前点的预测分类。
2.2 KNN算法实例讲解
这里会利用上诉的kNN数据集对KNN算法做逐步解释:
(1) 计算已知类别数据集中的点与当前点之间的距离:
要度量空间中点距离的话,有好几种度量方式,比如常见的曼哈顿距离计算,欧式距离计算等等。不过通常KNN算法中使用的是欧式距离:
得
(2) 按照距离递增次序排序
(3) 选取与当前点距离最小的k个点
我们知道K的取值比较重要,那么该如何确定K取多少值好呢?答案是通过交叉验证(将样本数据按照一定比例,拆分出训练用的数据和验证用的数据,比如6:4拆分出部分训练数据和验证数据),从选取一个较小的K值开始,不断增加K的值,然后计算验证集合的方差,最终找到一个比较合适的K值。
这里为了简化K值的选取,K值直接取4了。
即选取与电影10最近的4个电影:
(4) 确定前k个点所在类别的出现频率
当k取4的时候,包含3个爱情片和1个喜剧片
爱情片的频率:
喜剧片的频率:
(5) 返回前k个点出现频率最高的类别作为当前点的预测分类
因为
KMeans原理:
K-Means算法的特点是类别的个数是人为给定的,如果让机器自己去找类别的个数,通过一次次重复这样的选择质心-计算距离后分类-再次选择新质心的流程,直到我们分组之后所有的数据都不会再变化了,也就得到了最终的聚合结果。
KMeans过程:
(1)随机选取k个质心(k值取决于你想聚成几类)
(2)计算样本到质心的距离,距离质心距离近的归为一类,分为k类
(3)求出分类后的每类的新质心
(4)再次计算计算样本到新质心的距离,距离质心距离近的归为一类
(5)判断新旧聚类是否相同,如果相同就代表已经聚类成功,如果没有就循环2-4步骤直到相同
2.4 KMeans算法实例讲解
这里会利用上诉的KMeans数据集对KMeans算法做逐步解释。
(1)随机选取k个质心(k值取决于你想聚成几类)
假设我想聚3类,那我们随机选取【电影1、电影6、电影9】这3个电影作为质心(初始大佬)
(2)计算样本到质心的距离,距离质心距离近的归为一类,分为k类
计算除质心(大佬)外的样本(小弟)的欧式距离,样本(小弟)离哪个质心(大佬)近,该样本就跟哪个质心(大佬)
从上图可以看出:
电影2、电影3(小弟)离电影1(大佬)更近,所以他们3个暂时为A类
电影4、电影5、电影10(小弟)离电影6(大佬)更近,所以他们4个暂时为B类
电影7、电影8(小弟)离电影9(大佬)更近,所以他们3个暂时为C类
(3)求出分类后的每类的新质心
上面我们已经分为三类了,我们需要从三类中重新选出大佬(质心)。
A将电影2、电影3和电影1的平均值做A类的大佬,则A类新大佬(质心)为:
=(100,20,20)
同理也可以计算出B类新大佬(质心)为(17.5,98.75,17.5),C类新大佬(20,20,100)
(4)再次计算计算样本到新质心的距离,距离质心距离近的归为一类
同样用上面方法计算样本到质心(新大佬)的欧式距离,得
从上图可以看出:
电影1、电影2、电影3(小弟)离A类(新大佬)更近,他们归为一类
电影6、电影4、电影5、电影10(小弟)离B类(新大佬)更近,他们也归为一类
电影9、电影7、电影8(小弟)离C类(新大佬)更近,他们也归为一类
(5)判断新旧聚类是否相同
经过这次计算我们发现聚类情况并没有变化,这就说明我们的计算收敛已经结束了,不需要继续进行分组了,最终数据成功按照相似性分成了三组。即电影1,2,3为一类电影4,5,6,10为一类,电影7,8,9为一类,完成聚类。
三、算法编程
这部分我将用编程实现KNN,KMeans算法对上述数据集的预测。
3.1 KNN算法编程:
第一步:导入必要包
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
第二步:读入数据
data=pd.read_excel("KNNData.xlsx")
data
第三步:切分数据集
这步我们将数据集划分为训练集feature(train_x),训练集label(train_y),测试集feature(test_x),我们会利用train_x、train_y对KNN模型进行训练,然后将训练好的模型再对test_x做出预测
train_x=data.iloc[0:9,1:4]#红色部分
train_y=data.iloc[0:9,4:5]#绿色部分
test_x=data.iloc[9:10,1:4]#紫色部分
第四步:建模预测
knn=KNeighborsClassifier(n_neighbors=4)#n_neighbors=4即指定K值为4
knn.fit(train_x,train_y)#模型训练
knn.predict(test_x)#模型预测
结果:
最终模型预测输出结果为“爱情片”。再次验证了上文的解释。
3.2 KMeans算法编程
第一步:导入必要包
import pandas as pd
from sklearn.cluster import KMeans
第二步:读入数据
data=pd.read_excel("kmeans.xlsx")
data
第三步:切分数据集
这个就比较简单了,直接找出训练集feature(train_x)
train_x=data.iloc[0:10,1:4]#红色部分
第四步:建模预测
kmeans = KMeans(n_clusters=3)#n_clusters=3即指定划分为3个类型
kmeans.fit(train_x)#模型训练
y_kmeans = kmeans.predict(train_x)#模型预测
y_kmeans
结果:
最终模型输出结果为一个数组,它和电影名称是对应的:
0类的电影包括:电影4、电影5、电影6、电影10
1类的电影包括:电影1、电影2、电影3
2类的电影包括:电影7、电影8、电影9
再次验证上文解释。
欢迎关注、点赞、收藏、转发~
欢迎关注、点赞、收藏、转发~
欢迎关注、点赞、收藏、转发~