Python如何做K-means聚类:使用Scikit-Learn库、选择适当的k值、标准化数据、评估聚类效果
在Python中进行K-means聚类可以通过Scikit-Learn库来实现,这是一个强大且易用的机器学习库。首先,需要选择适当的k值,然后对数据进行标准化处理,最后通过评估聚类效果来判断聚类结果的质量。在这些步骤中,选择适当的k值至关重要,因为它直接影响聚类的效果。
一、使用Scikit-Learn库
Scikit-Learn库(简称sklearn)是Python中最常用的机器学习库之一,它提供了简洁且高效的工具来进行数据挖掘和数据分析。使用sklearn进行K-means聚类非常方便,下面是一个简单的例子来展示如何使用该库进行K-means聚类。
from sklearn.cluster import KMeans
import numpy as np
生成示例数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
初始化K-means模型
kmeans = KMeans(n_clusters=2, random_state=0)
拟合模型
kmeans.fit(X)
预测簇标签
labels = kmeans.predict(X)
print(labels)
在这个例子中,我们首先生成了一组二维数据,然后初始化了一个K-means模型并设定聚类数为2,最后通过fit
方法对数据进行聚类,并使用predict
方法预测每个样本的簇标签。
二、选择适当的k值
选择适当的k值是K-means聚类中最关键的一步。常用的方法包括肘部法(Elbow Method)和轮廓系数法(Silhouette Method)。
1. 肘部法
肘部法通过绘制不同k值下的总误差平方和(SSE)曲线,选择曲线出现“肘部”的位置对应的k值。
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
生成示例数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
存储不同k值下的SSE
sse = []
k_values = range(1, 10)
for k in k_values:
kmeans = KMeans(n_clusters=k, random_state=0)
kmeans.fit(X)
sse.append(kmeans.inertia_)
绘制SSE曲线
plt.plot(k_values, sse, 'bx-')
plt.xlabel('k')
plt.ylabel('SSE')
plt.title('Elbow Method for Optimal k')
plt.show()
2. 轮廓系数法
轮廓系数法通过计算不同k值下的轮廓系数(Silhouette Score),选择轮廓系数最高的k值。
from sklearn.metrics import silhouette_score
存储不同k值下的轮廓系数
sil_scores = []
for k in range(2, 10):
kmeans = KMeans(n_clusters=k, random_state=0)
labels = kmeans.fit_predict(X)
sil_scores.append(silhouette_score(X, labels))
绘制轮廓系数曲线
plt.plot(range(2, 10), sil_scores, 'bx-')
plt.xlabel('k')
plt.ylabel('Silhouette Score')
plt.title('Silhouette Method for Optimal k')
plt.show()
三、标准化数据
在进行K-means聚类之前,标准化数据是非常重要的,因为特征值的不同量纲会影响聚类结果。通常使用标准化方法是将数据转换为均值为0,标准差为1的标准正态分布。
from sklearn.preprocessing import StandardScaler
生成示例数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
四、评估聚类效果
评估聚类效果是确保K-means聚类成功的关键步骤。常用的评估指标包括轮廓系数(Silhouette Score)和德维斯-鲍丁指数(Davies-Bouldin Index)。
1. 轮廓系数
轮廓系数衡量的是聚类的紧密度和分离度,值越高表示聚类效果越好。
from sklearn.metrics import silhouette_score
生成示例数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
初始化K-means模型
kmeans = KMeans(n_clusters=2, random_state=0)
拟合模型并预测簇标签
labels = kmeans.fit_predict(X)
计算轮廓系数
sil_score = silhouette_score(X, labels)
print(f'Silhouette Score: {sil_score}')
2. 德维斯-鲍丁指数
德维斯-鲍丁指数衡量的是簇间的分离度和簇内的紧密度,值越低表示聚类效果越好。
from sklearn.metrics import davies_bouldin_score
生成示例数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
初始化K-means模型
kmeans = KMeans(n_clusters=2, random_state=0)
拟合模型并预测簇标签
labels = kmeans.fit_predict(X)
计算德维斯-鲍丁指数
db_score = davies_bouldin_score(X, labels)
print(f'Davies-Bouldin Index: {db_score}')
五、实例:使用K-means进行实际数据分析
通过一个具体的实例来展示如何使用K-means进行实际数据分析,我们将使用著名的Iris数据集进行聚类分析。
1. 导入数据
首先,导入Iris数据集并进行初步观察。
from sklearn.datasets import load_iris
import pandas as pd
导入Iris数据集
iris = load_iris()
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['species'] = iris.target
print(df.head())
2. 数据预处理
对数据进行标准化处理。
from sklearn.preprocessing import StandardScaler
提取特征数据
X = df.iloc[:, :-1]
标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
3. 选择适当的k值
使用肘部法和轮廓系数法选择适当的k值。
# 肘部法
sse = []
k_values = range(1, 10)
for k in k_values:
kmeans = KMeans(n_clusters=k, random_state=0)
kmeans.fit(X_scaled)
sse.append(kmeans.inertia_)
plt.plot(k_values, sse, 'bx-')
plt.xlabel('k')
plt.ylabel('SSE')
plt.title('Elbow Method for Optimal k')
plt.show()
轮廓系数法
sil_scores = []
for k in range(2, 10):
kmeans = KMeans(n_clusters=k, random_state=0)
labels = kmeans.fit_predict(X_scaled)
sil_scores.append(silhouette_score(X_scaled, labels))
plt.plot(range(2, 10), sil_scores, 'bx-')
plt.xlabel('k')
plt.ylabel('Silhouette Score')
plt.title('Silhouette Method for Optimal k')
plt.show()
4. 进行K-means聚类
选择k值后,进行K-means聚类。
# 选择k值为3
kmeans = KMeans(n_clusters=3, random_state=0)
labels = kmeans.fit_predict(X_scaled)
将聚类结果添加到数据集中
df['cluster'] = labels
print(df.head())
5. 评估聚类效果
使用轮廓系数和德维斯-鲍丁指数评估聚类效果。
sil_score = silhouette_score(X_scaled, labels)
db_score = davies_bouldin_score(X_scaled, labels)
print(f'Silhouette Score: {sil_score}')
print(f'Davies-Bouldin Index: {db_score}')
6. 可视化聚类结果
最后,对聚类结果进行可视化。
import seaborn as sns
import matplotlib.pyplot as plt
使用前两个主成分进行可视化
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
principal_components = pca.fit_transform(X_scaled)
df['pca1'] = principal_components[:, 0]
df['pca2'] = principal_components[:, 1]
绘制散点图
sns.scatterplot(x='pca1', y='pca2', hue='cluster', data=df, palette='viridis')
plt.title('K-means Clustering Results')
plt.show()
通过上述步骤,我们成功地使用Python中的Scikit-Learn库进行了K-means聚类,并对聚类效果进行了评估和可视化。这些步骤展示了如何从数据预处理、选择适当的k值到进行聚类和评估效果的完整过程。希望通过这些详细的步骤,你能够更好地理解如何在Python中进行K-means聚类。
相关问答FAQs:
Q: 什么是k-means聚类算法?
A: k-means聚类算法是一种常用的无监督学习算法,用于将数据集划分为k个不同的簇。它通过迭代计算来优化簇的中心点,使得每个样本点与最近的簇中心点之间的距离最小化。
Q: k-means聚类算法适用于哪些场景?
A: k-means聚类算法适用于那些需要将数据集划分为互不重叠的簇,并且每个簇的内部差异较小的场景。它可以用于数据挖掘、图像分割、文本聚类等任务。
Q: 如何使用Python实现k-means聚类算法?
A: 在Python中,可以使用scikit-learn库中的KMeans类来实现k-means聚类算法。首先,需要导入该类,然后根据需求设置算法的参数,如簇的数量k、迭代次数等。接下来,使用.fit()方法对数据进行训练,最后可以使用.labels_属性获取每个样本所属的簇的标签。
Q: k-means聚类算法有哪些优缺点?
A: k-means聚类算法的优点包括简单易用、计算速度快、可解释性强。然而,它也存在一些缺点,例如对初始簇中心的选择敏感、对异常值敏感、需要事先指定簇的数量等。在处理非凸形状的数据集时,k-means聚类算法表现可能较差。
原创文章,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/1258620