匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

如何使用Python实现数据分析中的聚类算法?

如何使用Python实现数据分析中的聚类算法?

聚类算法是一种常用的数据分析方法,它可以将数据集中的点按照一定的规则进行分组,使得同组内的点具有较高的相似性,而不同组之间的点具有较大的差异性。本文将介绍如何使用Python实现数据分析中的聚类算法,涵盖了K-means聚类算法和层次聚类算法两种方法。

K-means聚类算法:

K-means算法是一种基于贪心思想的聚类算法,它通过不断迭代去优化聚类结果,直到满足一定的停止条件。在K-means算法中,首先需要确定聚类的数量K,然后随机选择K个数据点作为初始聚类中心。对于每个数据点,计算它和各个聚类中心的距离,将它分配给距离最近的聚类中心所在的组。然后,再重新计算每个组的聚类中心,直到聚类中心不再发生变化或达到设定的最大迭代次数为止。

下面是使用Python实现K-means聚类算法的代码:

```
import numpy as np
import matplotlib.pyplot as plt

def K_means(X, K, max_iter=100):
    """
    X: 输入数据集,每行表示一个数据点
    K: 聚类的数量
    max_iter: 最大迭代次数
    """
    # 初始化聚类中心
    centroids = X[np.random.choice(X.shape[0], K, replace=False), :]
    for i in range(max_iter):
        # 计算每个数据点到每个聚类中心的距离
        distances = np.linalg.norm(X[:, np.newaxis, :] - centroids, axis=-1)
        # 分配每个数据点到距离最近的聚类中心所在的组
        groups = np.argmin(distances, axis=-1)
        # 更新每个组的聚类中心
        centroids_new = np.array([X[groups == k].mean(axis=0) for k in range(K)])
        # 判断聚类中心是否发生变化
        if np.allclose(centroids, centroids_new):
            break
        centroids = centroids_new
    return groups, centroids

# 测试代码
X = np.random.rand(100, 2)
groups, centroids = K_means(X, K=3)
plt.scatter(X[:, 0], X[:, 1], c=groups)
plt.scatter(centroids[:, 0], centroids[:, 1], marker='x')
plt.show()
```

层次聚类算法:

层次聚类算法是一种基于树形结构的聚类算法,它将数据点看作叶子节点,不断合并有相似性的节点,直到所有节点都合并为一个根节点。在层次聚类算法中,有两种合并方式:自底向上的凝聚聚类和自顶向下的分裂聚类。其中,凝聚聚类先将每个数据点看作一个独立的组,然后不断合并最近的两个组,形成更大的组,直到达到设定的停止条件为止。

下面是使用Python实现层次聚类算法的代码:

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

# 生成随机数据
np.random.seed(4711)
a = np.random.multivariate_normal([10, 0], [[3, 1], [1, 4]], size=[100,])
b = np.random.multivariate_normal([0, 20], [[3, 1], [1, 4]], size=[50,])
X = np.concatenate((a, b),)
plt.scatter(X[:,0], X[:,1])
plt.show()

# 计算距离矩阵
Z = linkage(X, 'ward')

# 绘制聚类结果
plt.figure(figsize=(25, 10))
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('sample index')
plt.ylabel('distance')
dendrogram(Z, leaf_rotation=90, leaf_font_size=8.)
plt.show()
```

在上面的代码中,我们使用Scipy库中的`linkage`函数计算距离矩阵,然后使用`dendrogram`函数绘制聚类结果。其中,距离的计算方式采用了Ward方法,它可以最小化每个组内的方差和,从而得到更加紧凑的聚类结果。

总结:

本文介绍了如何使用Python实现数据分析中的聚类算法,包括K-means聚类算法和层次聚类算法两种方法。通过这些代码示例,我们可以更加深入地理解聚类算法的原理和应用,从而为实际数据分析工作提供支持。