Python kmeans算法

Python kmeans算法

1. 简介

Kmeans算法是一种常用的聚类算法,它将n个样本分为k个聚类,使得每个样本点都属于离它最近的聚类中心。Kmeans的基本思想是通过迭代的方式,不断更新聚类中心,直至达到最优解。

Kmeans算法的步骤:
1. 随机选择k个中心点,作为初始聚类中心;
2. 将样本点分配到离它最近的聚类中心;
3. 更新聚类中心,将每个聚类中的样本点的均值作为新的聚类中心;
4. 重复步骤2和3,直至聚类中心不再改变或达到指定的迭代次数。

2. 实现

2.1 导入所需库

我们首先导入需要用到的库:numpy和matplotlib

import numpy as np
import matplotlib.pyplot as plt
Python

2.2 生成样本数据

为了演示kmeans算法,我们需要生成一些随机的样本数据。我们使用numpy的random模块生成两个独立的高斯分布,并将它们合并。

mean1 = [2, 2]
cov1 = [[0.5, 0], [0, 0.5]]
x1, y1 = np.random.multivariate_normal(mean1, cov1, 200).T

mean2 = [-2, -2]
cov2 = [[0.5, 0], [0, 0.5]]
x2, y2 = np.random.multivariate_normal(mean2, cov2, 200).T

X = np.concatenate((np.array([x1, y1]).T, np.array([x2, y2]).T))
Python

2.3 初始化聚类中心

在Kmeans算法中,聚类中心是随机选择的。这里我们选择两个样本作为初始聚类中心。

k = 2
np.random.shuffle(X)
initial_centers = X[:k]
Python

2.4 计算样本点到聚类中心的距离

为了将样本点分配到离它最近的聚类中心,我们需要计算样本点到聚类中心的距离。这里我们使用欧氏距离。

def calculate_distance(X, centers):
    distances = []
    for x in X:
        distances.append(np.linalg.norm(x - centers, axis=1))
    return np.array(distances)

distances = calculate_distance(X, initial_centers)
Python

2.5 分配样本点到聚类中心

根据计算得到的距离,我们将每个样本点分配到离它最近的聚类中心。

def assign_points(X, centers):
    distances = calculate_distance(X, centers)
    return np.argmin(distances, axis=1)

labels = assign_points(X, initial_centers)
Python

2.6 更新聚类中心

在Kmeans算法中,每个聚类中的样本点的均值将作为新的聚类中心。

def update_centers(X, labels, k):
    centers = []
    for i in range(k):
        indices = np.where(labels == i)
        centers.append(np.mean(X[indices], axis=0))
    return np.array(centers)

new_centers = update_centers(X, labels, k)
Python

2.7 迭代更新

我们将以上步骤2和步骤3进行迭代更新,直至聚类中心不再改变或达到指定的迭代次数。

def kmeans(X, k, max_iter=100):
    np.random.shuffle(X)
    centers = X[:k]
    for _ in range(max_iter):
        labels = assign_points(X, centers)
        new_centers = update_centers(X, labels, k)
        if np.all(centers == new_centers):
            break
        centers = new_centers
    return labels, centers

labels, centers = kmeans(X, k)
Python

3. 结果展示

最后,我们将生成的样本数据和聚类结果可视化。

plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='x')
plt.show()
Python

4. 总结

本文详细介绍了Python中的Kmeans算法,包括算法步骤和实现过程。通过生成随机样本数据并使用Kmeans算法进行聚类,我们得到了聚类结果的可视化。

Kmeans算法是一种常用的聚类算法,适用于处理具有明显分组特征的数据。对于大规模数据集,Kmeans算法可以通过优化算法实现高效计算。在实际应用中,Kmeans算法被广泛应用于图像分割、文本聚类、推荐系统等领域。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册