Python k-means聚类的python实现
1. 简介
k-means聚类是一种经典的无监督学习算法,用于将数据集划分为k个不同的组或簇。它的原理是通过计算数据点之间的相似性,并将相似的数据点聚集在同一个簇中,从而实现将数据划分为不同的组。本文将详细介绍k-means聚类算法的原理和实现。
2. 原理
k-means聚类的原理很简单,它主要包括以下几个步骤:
- 初始化k个聚类中心。可以随机选择k个数据点作为初始聚类中心。
- 分别计算每个数据点到k个聚类中心的距离,并将每个数据点划分到距离最近的聚类中心所属的簇。
- 更新每个簇的聚类中心,即将每个簇中的数据点的均值作为新的聚类中心。
- 重复步骤2和3,直到簇不再发生变化或达到最大迭代次数。
3. 实现步骤
下面将逐步介绍k-means聚类的python实现。假设有一个包含 n 个数据点的数据集,每个数据点有 m 个特征。
3.1 准备工作
首先导入必要的库,例如numpy用于数值计算和matplotlib用于可视化。
import numpy as np
import matplotlib.pyplot as plt
3.2 数据预处理
在进行聚类之前,我们需要对数据进行预处理。首先需要对数据进行归一化,以避免某些特征对聚类结果产生更大的影响。
def normalize_data(data):
min_vals = np.min(data, axis=0)
max_vals = np.max(data, axis=0)
normalized_data = (data - min_vals) / (max_vals - min_vals)
return normalized_data
3.3 初始化聚类中心
在k-means算法中,需要提前指定k值,即要将数据划分为多少个簇。然后从数据集中随机选择k个数据点作为初始的聚类中心。
def initialize_centers(data, k):
centers = np.zeros((k, data.shape[1]))
random_indices = np.random.choice(data.shape[0], k, replace=False)
centers = data[random_indices]
return centers
3.4 数据分配
在这一步中,需要计算每个数据点到k个聚类中心的距离,并将每个数据点分配到距离最近的聚类中心所属的簇。
def assign_clusters(data, centers):
distances = np.sqrt(((data - centers[:, np.newaxis])**2).sum(axis=2))
cluster_indices = np.argmin(distances, axis=0)
return cluster_indices
3.5 更新聚类中心
在这一步中,需要更新每个簇的聚类中心,即将每个簇中的数据点的均值作为新的聚类中心。
def update_centers(data, cluster_indices, k):
centers = np.zeros((k, data.shape[1]))
for i in range(k):
cluster_data = data[cluster_indices == i]
centers[i] = cluster_data.mean(axis=0)
return centers
3.6 完整的k-means聚类函数
将上述步骤整合到一个函数中,形成完整的k-means聚类函数。
def kmeans(data, k, max_iter=100):
# 数据预处理
normalized_data = normalize_data(data)
# 初始化聚类中心
centers = initialize_centers(normalized_data, k)
for i in range(max_iter):
# 数据分配
clusters = assign_clusters(normalized_data, centers)
# 更新聚类中心
new_centers = update_centers(normalized_data, clusters, k)
# 判断是否达到停止条件
if np.array_equal(centers, new_centers):
break
centers = new_centers
return clusters, centers
4. 示例
下面通过一个示例来演示如何使用上述实现的k-means聚类算法进行聚类。
首先生成一个包含三个簇的二维数据集。
np.random.seed(0)
# 生成三个簇的数据
cluster1 = np.random.randn(30, 2) + [2, 2]
cluster2 = np.random.randn(30, 2) + [-2, -1]
cluster3 = np.random.randn(30, 2) + [1, -3]
data = np.vstack([cluster1, cluster2, cluster3])
然后调用k-means聚类函数进行聚类。
clusters, centers = kmeans(data, k=3)
最后,可以用散点图将数据点和聚类中心可视化。
# 绘制聚类结果
plt.figure(figsize=(8, 6))
plt.scatter(data[:, 0], data[:, 1], c=clusters)
plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='x')
plt.title('K-means Clustering')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
图中每个数据点的颜色表示它所属的聚类簇,红色叉号表示簇的聚类中心。
5. 总结
本文介绍了k-means聚类算法的原理和python实现步骤。通过对数据的预处理、聚类中心的初始化、数据的分配和聚类中心的更新,可以得到较好的聚类结果。k-means算法是一种常用的聚类算法,可以用于许多不同类型的数据集。