简介
K-Means
算法是一种非监督学习算法,它可以将数据分为K个不同的簇或者组。在本文中,我们将会介绍 K-Means
算法的基本概念、原理、实现方法以及使用示例。
基本概念
簇
在 K-Means
算法中,簇指的是一个由数据点组成的集合,这些数据点具有相似的属性。例如,在对一个顾客数据库进行聚类时,同一簇中的顾客可能具有相似的购买记录、年龄、性别等属性。
距离度量
K-Means
算法中,需要使用距离度量来衡量不同数据点之间的距离。常用的距离度量有欧式距离、曼哈顿距离等。
中心点
每个簇都有一个中心点,该中心点是所有数据点的平均值,用于代表整个簇。
质心
质心指的是所有簇中心点的平均值,也可以理解为所有数据点的平均值。在 K-Means
算法中,质心通常用于计算新的中心点。
原理
K-Means
算法的基本原理是通过迭代寻找最优的簇分配方式,使得每个簇内部的数据点相似度尽可能高,而不同簇之间的相似度尽可能低。
具体步骤如下:
随机初始化 K
个中心点。
将所有数据点分配到离它们最近的中心点所在的簇中。
对每个簇,重新计算该簇的中心点。
重复步骤2和步骤3,直到簇的分配不再改变或者达到指定的迭代次数。
实现方法
我们将 K-Means
算法的实现封装在一个类中,该类包含以下方法:
- init():初始化类,其中
n_clusters
表示要聚类的簇的数量,max_iter
表示迭代次数,默认值为300。 - fit():训练模型,其中
X
表示数据集,返回聚类后的标签。 - predict():预测数据点所属的簇。
具体代码实现如下:
import numpy as np
class KMeans:
def __init__(self, n_clusters=8, max_iter=300):
self.n_clusters = n_clusters
self.max_iter = max_iter
def fit(self, X):
n_samples, n_features = X.shape
# 随机初始化质心
centroids = X[np.random.choice(n_samples, self.n_clusters, replace=False), :]
# 迭代计算质心和分配数据点到簇
for i in range(self.max_iter):
# 计算每个数据点到所有质心的距离
distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
# 分配数据点到距离最近的簇
labels = np.argmin(distances, axis=0)
# 更新质心
new_centroids = np.zeros((self.n_clusters, n_features))
for j in range(self.n_clusters):
new_centroids[j, :] = X[labels == j, :].mean(axis=0)
# 如果质心不再变化,退出循环
if np.allclose(new_centroids, centroids):
break
centroids = new_centroids
return labels
def predict(self, X):
distances = np.sqrt(((X - self.centroids[:, np.newaxis])**2).sum(axis=2))
labels = np.argmin(distances, axis=0)
return labels
使用示例
我们使用一个示例数据集来演示 K-Means
算法的使用
import matplotlib.pyplot as plt
# 生成示例数据
X = np.random.randn(200, 2)
X[:50, :] += 5
X[50:100, :] -= 5
# 初始化并训练模型
kmeans = KMeans(n_clusters=2)
labels = kmeans.fit(X)
# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.show()
上述代码生成了一个包含200个数据点的示例数据集,其中前50个点在(x,y)方向上都增加了5,后50个点在(x,y)方向上都减少了5。