python如何做k-means聚类

python如何做k-means聚类

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

(0)
Edit1Edit1
上一篇 2024年8月31日 上午9:11
下一篇 2024年8月31日 上午9:11
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部