调用kmeans方法然后把分类的显示出来_最通俗的话解释KNN,KMeans算法

2b2bddb3bb2a466248614fa487f1920b.png

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数据集

89c2bf6ab53b573e5a52a60754ce4c10.png

注:其中黄色标注为数据的特征,红色标注为数据集的label。

该数据的电影类型部分未知,即该数据部分label未知,我们需要通过KNN算法得出这些未知Label。

1.2 KMeans算法:

它是非监督学习中一种聚类算法,换句话说:喂给该算法模型都是无label的数据,杂乱无章的。

为了方便理解,我也同样构造了Kmeans数据集:

71bb0124466a17687a0ac66edbe5e7e9.png

该数据的电影类型都未知,即该数据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算法中使用的是欧式距离:

3119115c1a9ecfac1e430dc8d3be5438.png

(2) 按照距离递增次序排序

7571d69c94538f181cf1c4bb4bd503e6.png

(3) 选取与当前点距离最小的k个点

我们知道K的取值比较重要,那么该如何确定K取多少值好呢?答案是通过交叉验证(将样本数据按照一定比例,拆分出训练用的数据和验证用的数据,比如6:4拆分出部分训练数据和验证数据),从选取一个较小的K值开始,不断增加K的值,然后计算验证集合的方差,最终找到一个比较合适的K值。

这里为了简化K值的选取,K值直接取4了。

即选取与电影10最近的4个电影:

436ebd815e63f41cdd692c620e3e09bf.png

(4) 确定前k个点所在类别的出现频率

当k取4的时候,包含3个爱情片和1个喜剧片

爱情片的频率:

=

喜剧片的频率:

=

(5) 返回前k个点出现频率最高的类别作为当前点的预测分类

因为

(爱情)>
(喜剧),所以电影10属于爱情片,完成分类
2.3 KMeans原理、实现过程:

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个电影作为质心(初始大佬)

5f91d77eb292b5303fde31a4a14a7a79.png

(2)计算样本到质心的距离,距离质心距离近的归为一类,分为k类

计算除质心(大佬)外的样本(小弟)的欧式距离,样本(小弟)离哪个质心(大佬)近,该样本就跟哪个质心(大佬)

fbc56265aa106f2ab2c5de08d99ec790.png

从上图可以看出:

电影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)再次计算计算样本到新质心的距离,距离质心距离近的归为一类

同样用上面方法计算样本到质心(新大佬)的欧式距离,得

2b0258417a42996c1b056b02e480a67c.png

从上图可以看出:

电影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

cfeb5fbde0765404d80b40eba6298f53.png

第三步:切分数据集

这步我们将数据集划分为训练集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]#紫色部分

6cf0bda128fade2347a7f80df12409af.png

第四步:建模预测

knn=KNeighborsClassifier(n_neighbors=4)#n_neighbors=4即指定K值为4
knn.fit(train_x,train_y)#模型训练
knn.predict(test_x)#模型预测

结果:

f1afe1c0fef862f4ce7bdc55ae1b4738.png

最终模型预测输出结果为“爱情片”。再次验证了上文的解释。

3.2 KMeans算法编程

第一步:导入必要包

import pandas as pd
from sklearn.cluster import KMeans

第二步:读入数据

data=pd.read_excel("kmeans.xlsx")
data

5c0a093fc4c752a1dc03d96e718be8c4.png

第三步:切分数据集

这个就比较简单了,直接找出训练集feature(train_x)

train_x=data.iloc[0:10,1:4]#红色部分

5c2b0cd0f7d8e00122dce9b82386cfa3.png

第四步:建模预测

kmeans = KMeans(n_clusters=3)#n_clusters=3即指定划分为3个类型
kmeans.fit(train_x)#模型训练
y_kmeans = kmeans.predict(train_x)#模型预测
y_kmeans

结果:

5c37e8a3cbe641df5a60961707bd39b2.png

最终模型输出结果为一个数组,它和电影名称是对应的:

519c14996b17f924e0d9c18654c79e7a.png

0类的电影包括:电影4、电影5、电影6、电影10

1类的电影包括:电影1、电影2、电影3

2类的电影包括:电影7、电影8、电影9

再次验证上文解释。


欢迎关注、点赞、收藏、转发~

欢迎关注、点赞、收藏、转发~

欢迎关注、点赞、收藏、转发~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值