# 初始化 k 个聚类中心 defgetCenter(dataSet, k): # 行,列大小 m, n = dataSet.shape # 初始化 k 个聚类中心 center = np.zeros((k, n)) for i inrange(k): # 产生 k 个 [0, m) 的数 index = int(np.random.uniform(0, m)) center[i, :] = dataSet[index, :] return center
# 样本点到最近的聚类中心的距离 defgetClosestDist(data, center): min_dist = np.inf m = np.shape(center)[0] # 当前已经初始化的聚类中心的个数 for i inrange(m): # 计算样本点与每个聚类中心之间的距离 d = euclDistance(center[i, :], data) # 选择最短距离 if min_dist > d: min_dist = d return min_dist
# 初始化 k 个聚类中心 defgetCenterPlusPlus(dataSet, k): m, n = dataSet.shape # 初始化 k 个聚类中心 center = np.zeros((k, n)) # 1、随机选择一个样本点为第一个聚类中心 index = np.random.randint(0, m) center[0, :] = dataSet[index, :] # 初始化一个距离的序列 d = [0.0for _ inrange(m)]
for i inrange(1, k): sum_all = 0 for j inrange(m): # 2、对每一个样本找到最近的聚类中心点 d[j] = getClosestDist(dataSet[j, ], center[0:i, ]) # 将所有的最短距离相加 sum_all += d[j] # 3、用轮盘法选出下一个聚类中心 # 取得sum_all之间的随机值 sum_all *= np.random.random() for j, dis inenumerate(d): sum_all -= dis if sum_all > 0: continue # 选择新的聚类中心 center[i, :] = dataSet[j, :] break return center