Python实战开发及案例分析(8)—— 聚类算法

        聚类是一种将数据分组的无监督学习方法,其目标是使同组内的数据相似度高,不同组间的数据相似度低。常用的聚类算法包括K均值聚类、层次聚类和DBSCAN等。下面是这些算法的Python实现和案例分析。

案例分析:使用K均值聚类对数据集进行分组

项目背景:我们有一组二维数据点,目标是将这些点分成三组(即三类)。

K均值聚类算法

        K均值聚类是一种迭代算法,目标是通过最小化类内距离平方和来找到簇的最优分组。

Python 实现:

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np

# 生成示例数据
np.random.seed(0)
X = np.vstack([
    np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
])

# 使用K均值算法聚类
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.title('K-Means Clustering')
plt.show()

案例分析:使用层次聚类对数据集进行分组

项目背景:层次聚类的目标是通过递归合并或拆分簇来形成一组聚类。它可以通过聚合或分裂的方式进行。

层次聚类算法

Python 实现:

from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
import matplotlib.pyplot as plt
import numpy as np

# 生成示例数据
np.random.seed(0)
X = np.vstack([
    np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
])

# 进行层次聚类
Z = linkage(X, 'ward')
dendrogram(Z)
plt.xlabel('Samples')
plt.ylabel('Distance')
plt.title('Dendrogram for Hierarchical Clustering')
plt.show()

# 根据距离阈值分配簇标签
max_d = 5
clusters = fcluster(Z, max_d, criterion='distance')

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=clusters, s=50, cmap='viridis')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.title('Hierarchical Clustering')
plt.show()

案例分析:使用DBSCAN聚类算法

项目背景:DBSCAN是一种基于密度的聚类算法,它可以发现任意形状的簇,并识别出噪声点。

DBSCAN算法

Python 实现:

from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
import numpy as np

# 生成示例数据
np.random.seed(0)
X = np.vstack([
    np.random.normal(loc=[2, 2], scale=0.3, size=(50, 2)),
    np.random.normal(loc=[8, 3], scale=0.3, size=(50, 2)),
    np.random.normal(loc=[5, 8], scale=0.3, size=(50, 2)),
    np.random.normal(loc=[8, 8], scale=0.3, size=(50, 2))
])

# 使用DBSCAN算法聚类
dbscan = DBSCAN(eps=0.5, min_samples=5)
y_dbscan = dbscan.fit_predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=y_dbscan, s=50, cmap='viridis')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.title('DBSCAN Clustering')
plt.show()

结论

不同的聚类算法在面对不同形状、大小和密度的数据集时各有优缺点:

  • K均值聚类:适用于数据分布较均匀、簇数已知的情况,但对异常值敏感。
  • 层次聚类:可用于层次结构分析,适合较小规模的数据集。
  • DBSCAN:适用于发现任意形状的簇,同时识别噪声,但对参数设置敏感。

在实际应用中,选择合适的聚类算法需要结合数据的特性、任务的需求和算法的复杂度等因素。

案例分析:使用均值漂移(Mean Shift)聚类算法

项目背景:均值漂移是一种基于密度的聚类算法,通过平滑分布并逐步漂移均值来找到簇的峰值。它不需要预先指定簇的数量。

Mean Shift算法

Python 实现:

from sklearn.cluster import MeanShift, estimate_bandwidth
import matplotlib.pyplot as plt
import numpy as np

# 生成示例数据
np.random.seed(0)
X = np.vstack([
    np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
])

# 使用均值漂移算法聚类
bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=100)
meanshift = MeanShift(bandwidth=bandwidth, bin_seeding=True)
meanshift.fit(X)
labels = meanshift.labels_
cluster_centers = meanshift.cluster_centers_

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1], c='red', s=200, alpha=0.75, marker='X')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.title('Mean Shift Clustering')
plt.show()

案例分析:使用高斯混合模型(GMM)聚类算法

项目背景:GMM是一种基于概率模型的聚类方法,假定数据来自于多个不同的正态分布,并通过EM算法估计参数。

Gaussian Mixture Model算法

Python 实现:

from sklearn.mixture import GaussianMixture
import matplotlib.pyplot as plt
import numpy as np

# 生成示例数据
np.random.seed(0)
X = np.vstack([
    np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
])

# 使用GMM聚类
gmm = GaussianMixture(n_components=3, random_state=0)
gmm.fit(X)
labels = gmm.predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.title('Gaussian Mixture Model Clustering')
plt.show()

案例分析:使用谱聚类(Spectral Clustering)算法

项目背景:谱聚类是一种利用图论的聚类算法,通过对数据点之间的相似性矩阵进行谱分解来确定聚类。

Spectral Clustering算法

Python 实现:

from sklearn.cluster import SpectralClustering
import matplotlib.pyplot as plt
import numpy as np

# 生成示例数据
np.random.seed(0)
X = np.vstack([
    np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
])

# 使用谱聚类算法聚类
spectral = SpectralClustering(n_clusters=3, affinity='nearest_neighbors', random_state=0)
labels = spectral.fit_predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.title('Spectral Clustering')
plt.show()

结论

        我们在这几个案例中展示了不同聚类算法的使用和效果,包括:

  1. Mean Shift:适用于任意形状的聚类,且无需指定簇数量,但对参数选择敏感。
  2. Gaussian Mixture Model (GMM):基于概率模型,可对聚类进行概率解释。
  3. Spectral Clustering:通过相似性矩阵来定义数据点之间的关系,适用于发现复杂形状的聚类。

        不同的聚类算法在不同的场景下都有各自的优缺点。结合数据的特点和实际需求选择合适的算法,可以提高聚类的准确性和实用性。

        继续深入探讨更多的聚类算法,我们可以学习模糊C均值(FCM)和自组织映射(SOM)等技术,以及探讨如何评估聚类结果的质量。

案例分析:使用模糊C均值(Fuzzy C-Means)聚类算法

项目背景:模糊C均值聚类是一种允许数据点同时属于多个簇的聚类方法。每个数据点都分配了一个隶属度,表示其属于某一簇的概率。

FCM算法

Python 实现:

安装scikit-fuzzy库:

pip install scikit-fuzzy

代码实现:

import numpy as np
import matplotlib.pyplot as plt
import skfuzzy as fuzz

# 生成示例数据
np.random.seed(0)
X = np.vstack([
    np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
])

# 转置输入数据
X_T = X.T

# 使用模糊C均值算法聚类
cntr, u, u0, d, jm, p, fpc = fuzz.cluster.cmeans(
    X_T, 3, 2, error=0.005, maxiter=1000, init=None)

# 获取每个数据点的聚类标签
cluster_membership = np.argmax(u, axis=0)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=cluster_membership, s=50, cmap='viridis')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.title('Fuzzy C-Means Clustering')
plt.show()

案例分析:使用自组织映射(SOM)聚类算法

项目背景:自组织映射(SOM)是一种无监督学习的神经网络方法,通过映射高维数据到低维网格的方式实现聚类和数据可视化。

SOM算法

Python 实现:

安装minisom库:

pip install minisom

代码实现:

import numpy as np
import matplotlib.pyplot as plt
from minisom import MiniSom

# 生成示例数据
np.random.seed(0)
X = np.vstack([
    np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
])

# 使用SOM进行聚类
som = MiniSom(x=7, y=7, input_len=2, sigma=0.5, learning_rate=0.5)
som.random_weights_init(X)
som.train_random(X, 100)

# 获取每个数据点的聚类标签
labels = np.array([som.winner(x) for x in X])
unique_labels = {label: index for index, label in enumerate(np.unique(labels))}
cluster_membership = np.array([unique_labels[label] for label in labels])

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=cluster_membership, s=50, cmap='viridis')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.title('Self-Organizing Map Clustering')
plt.show()

聚类评估指标

        聚类算法的效果需要使用评估指标来衡量。常用的评估指标包括轮廓系数、调整兰德指数和聚类纯度。

使用轮廓系数评估聚类

Python 实现:

from sklearn.metrics import silhouette_score

# 生成示例数据
np.random.seed(0)
X = np.vstack([
    np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[8, 3], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[5, 8], scale=0.5, size=(50, 2))
])

# 使用K均值算法聚类
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=0)
labels = kmeans.fit_predict(X)

# 计算轮廓系数
score = silhouette_score(X, labels)
print(f'Silhouette Score: {score:.2f}')

结论

        我们进一步介绍了模糊C均值和自组织映射聚类算法,以及如何通过轮廓系数评估聚类效果。

  • Fuzzy C-Means:提供了一种更加灵活的聚类方法,允许数据点同时属于多个簇。
  • Self-Organizing Map (SOM):利用神经网络的方式映射高维数据,实现聚类和可视化。
  • 聚类评估:轮廓系数提供了一种评估聚类紧密度和分离度的方法。

        不同的聚类算法适用于不同的数据特性和应用场景。通过评估指标,可以更好地选择合适的聚类算法,提高模型的准确性和实用性。

### 回答1: kmeans聚类算法是一种常用的无监督学习算法,用于将数据集分成k个不同的簇。Python中有许多库可以实现kmeans聚类算法,例如scikit-learn和numpy等。下面是一个使用scikit-learn库实现kmeans聚类算法的示例代码: ```python from sklearn.cluster import KMeans import numpy as np # 生成随机数据 X = np.random.rand(100, 2) # 定义kmeans模型 kmeans = KMeans(n_clusters=3) # 训练模型 kmeans.fit(X) # 预测结果 y_pred = kmeans.predict(X) # 打印结果 print(y_pred) ``` 在这个例子中,我们生成了一个100行2列的随机数据集,然后使用KMeans类定义了一个kmeans模型,将数据集分成3个簇。接着,我们使用fit()方法训练模型,并使用predict()方法预测结果。最后,我们打印出预测结果。 ### 回答2: K-Means是一种聚类算法,是一种无监督学习算法。K-Means算法的核心思想是将数据点分成K个类,使每个样本点只属于一个类,且每个类的中心越接近该类中的样本点。这种算法通常用于数据挖掘领域,如客户分群,图像分割等。 在Python中实现K-Means算法,需要使用第三方库scikit-learn。下面是实现K-Means算法的步骤: 1.导入库 import numpy as np from matplotlib import pyplot as plt from sklearn.cluster import KMeans 2.创建数据集 x = np.array([[1, 1], [1.5, 2], [3, 4], [5, 7], [3.5, 5], [4.5, 5], [3.5, 4.5]]) 3.绘制数据集 plt.scatter(x[:, 0], x[:, 1]) plt.show() 4.创建K-Means模型 kmeans = KMeans(n_clusters=2, init='k-means++', max_iter=300, n_init=10, random_state=0) 其中,n_clusters表示分成K个类,init表示初始的质心位置,max_iter表示最大迭代次数,n_init表示随机初始化次数,random_state表示随机种子。 5.模型训练 y_kmeans = kmeans.fit_predict(x) 6.绘制分类结果图 plt.scatter(x[y_kmeans == 0, 0], x[y_kmeans == 0, 1], s=50, c='red', label='Cluster 1') plt.scatter(x[y_kmeans == 1, 0], x[y_kmeans == 1, 1], s=50, c='blue', label='Cluster 2') plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, c='yellow', label='Centroids') plt.legend() plt.show() 其中,y_kmeans表示每个样本点属于的类别,kmeans.cluster_centers_表示聚类中心的位置。 最终,我们将得到一个分类结果图,图中分成了两个类别,分别为红色和蓝色,黄色是聚类中心。 总结: K-Means聚类算法可以非常方便地用Python实现,通过K-Means算法可以将数据点分成多个类别,对于数据挖掘和机器学习方面有着广泛的应用,需要注意的是算法需要经过调整参数才可以得到最好的聚类效果。 ### 回答3: K-means是一种常见的无监督聚类算法,通过将数据分成具有相似特征的组进行分组。Python中有许多库可以使用,如Scikit-learn,通过使用Scikit-learn库中的KMeans模块,我们可以轻松实现K-means算法。 下面以一个实例来说明如何在Python中使用K-means算法: 首先,我们需要安装Scikit-learn库并导入KMeans模块。 ``` !pip install scikit-learn from sklearn.cluster import KMeans ``` 其次,我们需要准备一些数据,并为其设置相应的超参数。在这个例子中,我们将使用Iris数据集。 ``` from sklearn.datasets import load_iris iris = load_iris() X = iris.data y = iris.target ``` 在这里,X是我们的数据集,y是标签。我们将其传递给KMeans模型。 我们可以通过设置n_clusters来定义簇的数量,这是K-means算法最重要的超参数之一。除此之外,还有其他超参数可以进行设置,如n_init,max_iter等。 ``` kmeans = KMeans(n_clusters=3, n_init=10, max_iter=300) kmeans.fit(X) ``` 我们可以通过使用以下代码来获得分类后的簇中心: ``` cluster_centers = kmeans.cluster_centers_ print(cluster_centers) ``` 还可以使用以下代码来获得每个数据点的标签: ``` labels = kmeans.labels_ print(labels) ``` 最后,我们可以使用以下代码来对模型进行可视化,以便更好地了解算法的工作原理: ``` import matplotlib.pyplot as plt plt.scatter(X[:,0], X[:,1], c=labels) plt.scatter(cluster_centers[:,0], cluster_centers[:,1], c='red', marker='x') plt.show() ``` 这将生成包含我们分类后的数据点和簇中心的散点图。 总之,在Python中使用K-means算法非常容易,使用Scikit-learn库中的KMeans模块,我们可以快速实现一个聚类分析解决方案,并将其应用于许多不同的问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贾贾乾杯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值