机器学习代码实战——KMeans(聚类)

1.实验目的

1.使用sklearn库中的鸢尾花数据集,并尝试使用花瓣的宽度和长度特征来形成
2. 为简单起见,删除其他两个特征。
3. 找出是否有任何预处理(例如缩放)可以帮助解决问题,绘制肘部曲线,从中得出k的最佳值

2.导入必要模块

from sklearn.cluster import KMeans    #从sklearn导入KMeans算法
import pandas as pd  
from sklearn.preprocessing import MinMaxScaler  #数据预处理中的缩放模块
from matplotlib import pyplot as plt 
from sklearn.datasets import load_iris    #从sklearn导入iris数据
%matplotlib inline   

3.用pandas处理数据

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names) #构建df
df.drop(['sepal length (cm)','sepal width (cm)'],axis = 'columns',inplace = True)   #只取两个特征,故把另外两个特征drop掉
df.head()    #打印前5条记录检验操作是否正确

在这里插入图片描述

4.拟合+预测

km = KMeans(n_clusters=3)   #设定超参数聚类数为3
y_predicted = km.fit_predict(df)   #拟合+预测
y_predicted    #打印聚类结果(0表示第1个簇,1表示第2个簇,2表示第3个簇)

在这里插入图片描述

5.把预测结果合并到DF

df['cluster'] = y_predicted
df.head()

在这里插入图片描述

6.可视化聚类效果

df1 = df[df.cluster==0]  #过滤出簇0
df2 = df[df.cluster==1]  #过滤出簇1
df3 = df[df.cluster==2]  #过滤出簇2

plt.scatter(df1['petal length (cm)'],df1['petal width (cm)'],color='blue')   #画簇0的散点图
plt.scatter(df2['petal length (cm)'],df2['petal width (cm)'],color='green')  #画簇1的散点图
plt.scatter(df3['petal length (cm)'],df3['petal width (cm)'],color='yellow') #画簇2的散点图
plt.scatter(km.cluster_centers_[:,0],km.cluster_centers_[:,1],color='red',marker='+',label='centroid')  #画每个簇的中心

在这里插入图片描述

7.比较不同的簇数的均方误差

distance = []
for k in range(1,11):
    km = KMeans(n_clusters=k)
    km.fit(df[['petal length (cm)','petal width (cm)']])
    distance.append(km.inertia_)
    
plt.xlabel('K')
plt.ylabel('Sum of squared error')
plt.plot(range(1,11),distance)

在这里插入图片描述
效果如图:均方误差图形像一个手臂,一般在肘部为k的最佳值。

8.对数据归一化处理

有时,由于数据的取值范围不同会影响聚类的效果,因此在拟合数据前,我们最好对数据进行归一化。只需在步骤4前加如下代码。

scaler = MinMaxScaler()

scaler.fit(df[['petal length (cm)']])   #计算用于以后缩放的最小值和最大值
df['petal length (cm)'] = scaler.transform(df[['petal length (cm)']])  #根据feature_range缩放X的特征
scaler.fit(df[['petal width (cm)']])
df['petal width (cm)'] = scaler.transform(df[['petal width (cm)']])

效果:
在这里插入图片描述
在这里插入图片描述

发布了195 篇原创文章 · 获赞 566 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_37763870/article/details/105271014