在分析数据时,我们的思维中的一个目标是找到隐藏的模式并提取有意义的见解。让我们进入新的基于机器学习的学习类别,即无监督学习,其中解决聚类任务的强大算法之一是K-Means聚类算法,它彻底改变了数据理解。
K-Means已成为机器学习和数据挖掘应用中的有用算法。在本文中,我们将深入探讨K-Means的工作原理,使用Python实现以及探索其原理、应用等。所以,让我们开始解锁秘密模式的旅程,利用K-Means聚类算法的潜力。
什么是K-Means算法?
K-Means算法用于解决属于无监督学习类别的聚类问题。借助这个算法,我们可以将观测数据分组为K个簇。
该算法内部使用向量量化,通过该方法,我们可以将数据集中的每个观测数据分配给与其最小距离的簇,这是聚类算法的原型。这种聚类算法通常用于基于相似度度量将数据分区为K个簇的数据挖掘和机器学习中。因此,在该算法中,我们需要最小化观测数据与其对应质心之间的平方距离之和,最终得到不同且同质的簇。
K-means聚类的应用
以下是一些该算法的标准应用。K-means聚类算法是解决与聚类相关问题的工业应用中常用的技术。
- 客户分割:K-means聚类可以根据客户的兴趣将不同的客户分割成组。它可以应用于银行、电信、电子商务、体育、广告、销售等领域。
- 文档聚类:在这个技术中,我们将一组文档中的相似文档归为一类,从而使得同一类别中的文档相似。
- 推荐引擎:有时,K-means聚类可用于创建推荐系统。例如,您想向朋友推荐歌曲。您可以查看该人喜欢的歌曲,然后使用聚类找到相似的歌曲并推荐最相似的。
还有很多应用,我相信您已经想到了一些,并且可能会在本文下方的评论部分分享。
使用Python实现K-Means聚类
在本部分,我们将使用Python在一个数据集上开始实现K-Means算法,该算法主要用于数据科学项目。
1. 导入必要的库和依赖项
首先,让我们导入用于实现K-means算法的Python库,包括NumPy、Pandas、Seaborn、Marplotlib等。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
2. 加载和分析数据集
在这一步中,我们将通过将数据存储在Pandas数据帧中来加载学生数据集。要下载数据集,您可以参考此链接。
问题的完整流程如下图所示:
df = pd.read_csv('student_clustering.csv')
print("数据的形状为",df.shape)
df.head()
3. 数据集的散点图
现在进入建模步骤,我们要可视化数据,因此使用matplotlib绘制散点图来检查聚类算法的工作原理并创建不同的聚类。
# 数据集的散点图
import matplotlib.pyplot as plt
plt.scatter(df['cgpa'],df['iq'])
输出:
4. 从Scikit-learn的Cluster类中导入K-Means
现在,由于我们要实施K-Means聚类,我们首先导入cluster类,然后我们有KMeans作为该类的模块。
from sklearn.cluster import KMeans
5. 使用弯曲法找到K的最优值
在此步骤中,我们将在实现算法时找到K的最优值,其中K值表示我们必须为数据集创建多少个聚类。直观地找到这个值是不可能的,所以为了找到最优值,我们将在WCSS(聚类内部平方和)和不同的K值之间创建一个图表,我们必须选择使得WCSS值最小的K。
# 创建一个空列表来存储残差
wcss = []
for i in range(1,11):
# 创建一个K-Means类的对象
km = KMeans(n_clusters=i)
# 将数据传递给算法进行拟合
km.fit_predict(df)
# 将惯性值添加到wcss列表中
wcss.append(km.inertia_)
现在,让我们绘制弯曲图以找到K的最优值。
# 绘制WCSS与K的图表以检查K的最优值
plt.plot(range(1,11),wcss)
输出:
从上面的弯曲图中,我们可以看到在K = 4时,WCSS值有所下降,这意味着如果我们使用4作为最优值,那么聚类将会有很好的性能。
6. 使用最优值的K-Means算法进行拟合
我们已经找到了K的最优值。现在,让我们进行建模,我们将创建一个存储所有特征的完整数据集X数组。在这里不需要分离目标和特征向量,因为这是一个无监督问题。之后,我们将使用选定的K值创建一个KMeans类的对象,然后将其拟合到提供的数据集上。最后,我们打印y_means,它表示不同聚类的均值。
X = df.iloc[:,:].values # 使用完整数据进行模型构建
km = KMeans(n_clusters=4)
y_means = km.fit_predict(X)
y_means
7. 检查每个类别的聚类分配
让我们检查数据集中的哪些点属于哪个聚类。
X[y_means == 3,1]
到目前为止,对于质心初始化,我们使用了K-Means++策略,现在,让我们初始化随机质心而不是K-Means++,并通过遵循相同的过程来比较结果。
km_new = KMeans(n_clusters=4, init='random')
y_means_new = km_new.fit_predict(X)
y_means_new
检查有多少个值匹配。
sum(y_means == y_means_new)
8. 可视化聚类结果
为了可视化每个聚类,我们将它们绘制在坐标轴上,并通过分配不同的颜色来区分它们,从而可以轻松地看到形成的4个聚类。
plt.scatter(X[y_means == 0,0],X[y_means == 0,1],color='blue')
plt.scatter(X[y_means == 1,0],X[y_means == 1,1],color='red')
plt.scatter(X[y_means == 2,0],X[y_means == 2,1],color='green')
plt.scatter(X[y_means == 3,0],X[y_means == 3,1],color='yellow')
输出:
9. 三维数据上的 K-Means 算法
由于之前的数据集有2列,我们可以看作是一个二维问题。现在,我们将使用相同的步骤来处理一个三维问题,并尝试分析代码在n维数据上的可复现性。
# 从 sklearn 中创建一个合成数据集
from sklearn.datasets import make_blobs # 生成合成数据集
centroids = [(-5,-5,5),(5,5,-5),(3.5,-2.5,4),(-2.5,2.5,-4)]
cluster_std = [1,1,1,1]
X,y = make_blobs(n_samples=200,cluster_std=cluster_std,centers=centroids,n_features=3,random_state=1)
# 绘制数据集的散点图
import plotly.express as px
fig = px.scatter_3d(x=X[:,0], y=X[:,1], z=X[:,2])
fig.show()
输出:
wcss = []
for i in range(1,21):
km = KMeans(n_clusters=i)
km.fit_predict(X)
wcss.append(km.inertia_)
plt.plot(range(1,21),wcss)
输出:
图7 肘部图 | 作者提供的图片
# 使用最佳的 K 值拟合 K-Means 算法
km = KMeans(n_clusters=4)
y_pred = km.fit_predict(X)
# 分析形成的不同聚类
df = pd.DataFrame()
df['col1'] = X[:,0]
df['col2'] = X[:,1]
df['col3'] = X[:,2]
df['label'] = y_pred
fig = px.scatter_3d(df,x='col1', y='col2', z='col3',color='label')
fig.show()
输出:
图8 聚类可视化 | 作者提供的图片
你可以在这里找到完整的代码 – Colab Notebook
总结
这就完成了我们的讨论。我们已经讨论了 K-Means 的工作原理、实现和应用。总之,实现聚类任务是一种广泛使用的无监督学习算法,它提供了一种简单直观的方法来对数据集的观测进行分组。该算法的主要优势在于根据用户实现算法时选择的相似性度量将观测分成多个集合。
然而,基于第一步中质心的选择,我们的算法的行为会有所不同并收敛到局部或全局最优解。因此,选择聚类数目来实现该算法,预处理数据,处理异常值等对于获得良好结果至关重要。但是,如果我们观察这个算法在限制条件之外的另一面,K-Means是一种在各个领域中进行探索性数据分析和模式识别的有用技术。Aryan Garg是一名电气工程学士学位的学生,目前正在本科的最后一年。他对Web开发和机器学习领域很感兴趣。他一直追求这个兴趣,并渴望在这些方向上做更多的工作。