Kmeans计算簇半径时euclidean_distances取[:,0]的含义及原因
[:, 0]在K-Means簇半径计算代码中的含义 你疑惑的核心点是没搞清楚euclidean_distances的返回值结构:
- 这个scikit-learn自带的距离计算函数,返回的是二维距离矩阵,形状规则为
(第一个参数的样本数, 第二个参数的样本数),矩阵第i行第j列的值,就是第一个参数里的第i个样本,到第二个参数里第j个样本的欧氏距离。 - 看你代码里的传参:第一个参数
X是当前簇的所有观测样本,第二个参数传的是[center]——你把单个簇中心包成了长度为1的列表,也就是说第二个参数里只有1个样本(就是当前簇中心),所以返回的距离矩阵形状是(簇内样本数, 1),全程只有1列,根本不存在第二列。
这时候再看[:, 0]的作用,这是numpy的标准二维数组索引语法:
- 索引第一维(行位置)写
:,代表选中所有行,也就是覆盖簇内的全部观测样本 - 索引第二维(列位置)写
0,代表选中第0列,也就是距离矩阵里唯一的那一列 - 经过这个索引后,原本形状为
(n,1)的二维距离矩阵,会被转换成形状为(n,)的一维数组,数组里每个元素就是对应样本到当前簇中心的直线距离,之后用np.max取最大值,得到的就是簇的半径(簇内离中心最远的点到中心的距离)。
举个直观的例子,如果你的簇内有3个样本,euclidean_distances(X, [center])直接返回的结果是这样的二维数组:
# 形状为(3,1) array([[0.32], [1.74], [0.89]])
如果不加[:,0]直接对这个二维数组求最大值,虽然数值结果不会错,但保留冗余的维度会给后续其他计算带来不必要的麻烦,所以这里加索引压平维度是非常常规的写法。
内容的提问来源于stack exchange,提问作者Joseph_
相关产品推荐
相关产品推荐

