适用于谱聚类的K-Means实现。头歌import numpy as np import copy from collections import defaultdict from sklearn.datasets import make_blobs class KMEANS: def __init__(self, n_cluster, epsilon=1e-3, maxstep=2000): self.n_cluster = n_cluster self.epsilon = epsilon self.maxstep = maxstep self.N = None self.centers = None self.cluster = defaultdict(list) def init_param(self, data): # 初始化参数, 包括初始化簇中心 self.N = data.shape[0] random_ind = np.random.choice(self.N, size=self.n_cluster) self.centers = [data[i] for i in random_ind] # list存储中心点坐标数组 for ind, p in enumerate(data): # 请在此添加实现代码 # # ********** Begin *********# # ********** End ***********# return def _cal_dist(self, center, p): # 请在此添加实现代码 # # ********** Begin *********# # 计算点到簇中心的距离平方 # ********** End ***********# def mark(self, p): dists = [] for center in self.centers: # 请在此添加实现代码 # # ********** Begin *********# # 计算样本点到每个簇中心的距离,选取最小的簇 # ********** End ***********# return dists.index(min(dists)) def update_center(self, data): for label, inds in self.cluster.items(): # 请在此添加实现代码 # # ********** Begin *********# # 更新簇的中心坐标 # ********** End ***********# return def divide(self, data): tmp_cluster = copy.deepcopy(self.cluster) # 迭代过程中,字典长度不能发生改变,故deepcopy for label, inds in tmp_cluster.items(): # 请在此添加实现代码 # # ********** Begin *********# # 重新对样本聚类 # 若类标记不变,跳过 # ********** End ***********# return def cal_err(self, data): # 计算MSE mse = 0 for label, inds in self.cluster.items(): # 请在此添加实现代码 # # ********** Begin *********# # ********** End ***********# return mse / self.N def fit(self, data): self.init_param(data) step = 0 while step < self.maxstep: # 请在此添加实现代码 # # ********** Begin *********# # ********** End ***********# return
时间: 2025-06-06 14:17:43 浏览: 43
### 适用于谱聚类的K-Means算法完整Python实现
以下是一个完整的适用于谱聚类的K-Means算法实现代码,包含初始化参数、计算距离、标记样本、更新簇中心、重新聚类和计算误差的具体逻辑。
```python
import numpy as np
from scipy.spatial.distance import cdist
def kmeans_spectral(data, n_clusters=2, max_iter=300, tol=1e-4, init='random', random_state=None):
"""
谱聚类中的K-Means算法实现。
参数:
data (numpy.ndarray): 输入数据矩阵,形状为(n_samples, n_features)。
n_clusters (int): 簇的数量,默认为2。
max_iter (int): 最大迭代次数,默认为300。
tol (float): 收敛容忍度,默认为1e-4。
init (str or numpy.ndarray): 初始簇中心的获取方法或自定义初始簇中心,默认为'random'。
random_state (int): 随机数种子,用于可重复性。
返回:
labels (numpy.ndarray): 每个样本所属的簇标签。
centers (numpy.ndarray): 最终的簇中心。
error (float): K-Means算法的误差(所有点到其对应簇中心的距离平方和)。
"""
if random_state is not None:
np.random.seed(random_state)
# 初始化簇中心
if isinstance(init, str) and init == 'random':
centers = data[np.random.choice(data.shape[0], size=n_clusters, replace=False)]
elif isinstance(init, np.ndarray):
centers = init
else:
raise ValueError("Invalid initialization method.")
for _ in range(max_iter):
# 计算每个样本到簇中心的距离
distances = cdist(data, centers, metric='euclidean') # 使用欧氏距离[^1]
# 标记样本所属的簇
labels = np.argmin(distances, axis=1)
# 更新簇中心
new_centers = np.array([data[labels == i].mean(axis=0) for i in range(n_clusters)])
# 检查是否收敛
center_shift = np.linalg.norm(new_centers - centers, axis=1)
if np.all(center_shift < tol):
break
centers = new_centers
# 计算误差
error = np.sum(np.min(cdist(data, centers, metric='euclidean'), axis=1))
return labels, centers, error
```
#### 参数说明
1. **`data`**: 输入数据矩阵,通常是从谱聚类中得到的降维特征矩阵。
2. **`n_clusters`**: 指定的簇数量,与谱聚类的簇划分一致[^1]。
3. **`max_iter`**: 最大迭代次数,防止算法陷入无限循环。
4. **`tol`**: 收敛容忍度,当簇中心的变化小于该值时停止迭代[^1]。
5. **`init`**: 初始簇中心的获取方法,可以是字符串`'random'`表示随机选择,或者提供一个自定义的初始簇中心数组。
6. **`random_state`**: 随机数种子,确保结果的可重复性。
#### 具体逻辑
1. **初始化簇中心**:根据用户指定的方式初始化簇中心。如果选择`'random'`,则从数据集中随机选取`n_clusters`个样本作为初始簇中心[^4]。
2. **计算距离**:使用`scipy.spatial.distance.cdist`函数计算每个样本到所有簇中心的欧氏距离[^1]。
3. **标记样本**:将每个样本分配到距离最近的簇中心所对应的簇[^3]。
4. **更新簇中心**:基于当前簇划分,重新计算每个簇的质心[^4]。
5. **检查收敛**:如果簇中心的变化小于容忍度`tol`,则停止迭代[^1]。
6. **计算误差**:最终误差为所有样本到其对应簇中心的距离平方和[^1]。
---
###
阅读全文