Kmeans均值聚类算法原理以及Python如何实现

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算法的效率和灵活性。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签