import numpy as np
class KMeans:
def __init__(self, k=3, max_iters=100, random_state=None):
"""
初始化 K-Means 模型
:param k: 簇的数量
:param max_iters: 最大迭代次数
:param random_state: 随机种子
"""
self.k = k
self.max_iters = max_iters
self.random_state = random_state
self.centroids = None
self.labels = None
def _initialize_centroids(self, X):
"""
随机初始化质心
:param X: 数据集
"""
np.random.seed(self.random_state)
random_indices = np.random.choice(X.shape[0], self.k, replace=False)
self.centroids = X[random_indices]
def _assign_clusters(self, X):
"""
将每个数据点分配到最近的质心所在的簇
:param X: 数据集
:return: 每个数据点的簇标签
"""
distances = np.linalg.norm(X[:, np.newaxis] - self.centroids, axis=2)
return np.argmin(distances, axis=1)
def _update_centroids(self, X, labels):
"""
更新质心
:param X: 数据集
:param labels: 每个数据点的簇标签
"""
self.centroids = np.array([X[labels == i].mean(axis=0) for i in range(self.k)])
def fit(self, X):
"""
训练 K-Means 模型
:param X: 数据集
"""
self._initialize_centroids(X)
for _ in range(self.max_iters):
labels = self._assign_clusters(X)
new_centroids = self._update_centroids(X, labels)
if np.all(self.centroids == new_centroids):
break
self.labels = labels
def predict(self, X):
"""
预测新数据点的簇标签
:param X: 新数据点
:return: 新数据点的簇标签
"""
return self._assign_clusters(X)
# 示例代码
if __name__ == "__main__":
# 生成随机数据
np.random.seed(42)
X = np.random.rand(100, 2)
# 初始化 K-Means 模型
kmeans = KMeans(k=3, max_iters=100, random_state=42)
# 训练模型
kmeans.fit(X)
# 预测簇标签
labels = kmeans.predict(X)
# 打印结果
print("簇标签:", labels)
09-21
2254
2254
07-18
829
829
11-07
3247
3247

被折叠的 条评论
为什么被折叠?



