scipy.cluster.vq.kmeans(obs, k_or_guess, iter=20, thresh=1e-05, check_finite=True)
对形成k个群集的一组观察向量执行k均值。
k均值算法将观测值的分类调整为聚类,并更新聚类质心,直到质心的位置在连续迭代中保持稳定为止。 在算法的这种实现中,质心的稳定性是通过将观测值及其对应质心之间的平均欧几里德距离的变化的绝对值与阈值进行比较来确定的。 这样便产生了一个将质心映射到代码的codebook,反之亦然。
参数
- obs
M×N阵列的每一行都是观察向量。 列是每次观察期间看到的特征。 必须先使用whiten将特征增白。 - k_or_guess
生成的质心数。 将代码分配给每个质心,这也是质心在生成的code_book矩阵中的行索引。
通过从观察矩阵中随机选择观察值来选择初始k重心。 可替代地,将k乘以N数组指定初始的k个质心。 - iter
运行k均值的次数,返回具有最低失真的代码本。 如果为k_or_guess参数的数组指定了初始质心,则将忽略此参数。 此参数不代表k均值算法的迭代次数。 - thresh
如果自上次k均值迭代以来失真的变化小于或等于阈值,则终止k均值算法。 - check_finite
是否检查输入矩阵仅包含有限数。 禁用可能会提高性能,但是如果输入中确实包含无穷大或NaN,则可能会导致问题(崩溃,终止)。 默认值:True
返回值
- codebook
由k个质心组成的k x N数组。 第i个质心代码簿[i]用代码i表示。 生成的质心和代码表示所看到的最低失真,而未必是全局最小失真。 - distortion
通过的观测值与生成的质心之间的平均(非平方)欧氏距离。 请注意,在k均值算法的上下文中,失真的标准定义有所不同,即平方距离的总和。
import numpy as np
from scipy.cluster.vq import vq, kmeans, whiten
import matplotlib.pyplot as plt
features = np.array([[1.9,2.0],
[1.7,2.5],
[1.6,3.1],
[0.1,0.1],
[0.8,0.3],
[0.4,0.3],
[0.22,0.1],
[0.4, 0.3],
[0.4,0.5],
[1.8,1.9]])
wf = whiten(features)
print("whiten features: \n", wf)
book = np.array((wf[0], wf[1]))
codebook, distortion = kmeans(wf, book)
# 可以写kmeans(wf,2), 2表示两个质心,同时启用iter参数
print("codebook:", codebook)
print("distortion: ", distortion)
plt.scatter(wf[:,0], wf[:,1])
plt.scatter(codebook[:, 0], codebook[:, 1], c='r')
plt.show()