1. Kmeans均值聚类算法原理
Kmeans(K-均值)是一种常见的聚类算法,主要用于将一组数据划分为K个不同的簇。该算法的目标是通过最小化每个样本与所属簇的平方欧式距离之和来找到最优的簇划分。
1.1 算法步骤
Kmeans算法的核心思想是迭代更新类心,具体步骤如下:
Step 1: 从样本中随机选择K个点作为初始的类心。
# 选择初始类心
def initialize_centers(X, K):
centers = []
for _ in range(K):
center = random.choice(X)
centers.append(center)
return centers
Step 2: 对于每个样本点,计算其与每个类心之间的欧氏距离,并将其划分到距离最小的簇。
# 划分样本到簇
def assign_clusters(X, centers):
clusters = [[] for _ in range(len(centers))]
for x in X:
distances = [euclidean_distance(x, center) for center in centers]
cluster_index = distances.index(min(distances))
clusters[cluster_index].append(x)
return clusters
Step 3: 对每个簇,通过计算其中样本的均值,更新类心的位置。
# 更新类心
def update_centers(clusters):
centers = []
for cluster in clusters:
center = np.mean(cluster, axis=0)
centers.append(center)
return centers
Step 4: 重复Step 2和Step 3,直到类心不再改变或达到最大迭代次数。
# 迭代更新
def kmeans(X, K, max_iterations):
centers = initialize_centers(X, K)
for _ in range(max_iterations):
clusters = assign_clusters(X, centers)
new_centers = update_centers(clusters)
if centers == new_centers:
break
centers = new_centers
return clusters, centers
1.2 算法性能
Kmeans算法具有下面几点性能特点:
快速: Kmeans算法的时间复杂度为O(n*K*d*m),其中n为样本数量,K为簇的数量,d为样本的维度,m为最大迭代次数。
对大规模数据集不够高效: 当数据集非常大时,计算距离矩阵和聚类结果的存储将需要大量的内存。
对初始类心位置敏感: Kmeans算法的结果可能会收敛到局部最优解,因此初始类心的选择对最终的聚类结果具有影响。
只适用于数值型数据: Kmeans算法使用欧氏距离作为相似度度量,因此只适用于数值型数据。
2. Python实现Kmeans算法
下面是使用Python实现Kmeans算法的示例代码:
import numpy as np
import random
from scipy.spatial.distance import euclidean
def initialize_centers(X, K):
centers = []
for _ in range(K):
center = random.choice(X)
centers.append(center)
return centers
def assign_clusters(X, centers):
clusters = [[] for _ in range(len(centers))]
for x in X:
distances = [euclidean(x, center) for center in centers]
cluster_index = distances.index(min(distances))
clusters[cluster_index].append(x)
return clusters
def update_centers(clusters):
centers = []
for cluster in clusters:
center = np.mean(cluster, axis=0)
centers.append(center)
return centers
def kmeans(X, K, max_iterations):
centers = initialize_centers(X, K)
for _ in range(max_iterations):
clusters = assign_clusters(X, centers)
new_centers = update_centers(clusters)
if centers == new_centers:
break
centers = new_centers
return clusters, centers
# 调用示例
X = [[1, 2], [2, 1], [3, 4], [4, 3], [5, 6], [6, 5]]
K = 2
max_iterations = 100
clusters, centers = kmeans(X, K, max_iterations)
print("Clusters:", clusters)
print("Centers:", centers)
以上代码中,我们首先定义了一个函数用于计算欧式距离,并用于在Step 2中计算样本与类心的距离。接着,我们实现了初始化类心、分配样本到簇、更新类心位置和迭代更新的函数。最后,我们调用kmeans函数进行实际的聚类操作,并输出结果。
通过上述代码示例,我们可以看到Kmeans算法的实现非常简洁。同时,由于Python强大的科学计算库(如numpy和scipy),我们可以方便地进行向量运算和距离计算,进一步提高了Kmeans算法的效率和灵活性。