1 致谢
感谢MathWorks的官方文档,
链接如下:
https://ww2.mathworks.cn/help/matlab/math/array-indexing.html
2 前言
今天在学习K-means算法~
在K-means算法每次迭代的过程中,需要计算样本点与质心之间的距离,并对该样本点进行分类,
作业中说“You can use a for-loop over the examples to compute this.”,但是我还是希望能通过矩阵化来实现,
以提高代码的计算效率,我们首先来看看数据涉及的几个维度:
那就是,样本点的数量,质心的数量,
因为每个样本点与质心都对应着一个距离,
然后样本点数据本身的维度为2,因为有X和Y两个坐标,
所以,综上所述,数据的维度有三维:样本点数量,质心数量和坐标数量。
由于数据具有三个维度,所以构成了三维张量,
而作业中给出的数据,(无论是样本点数据还是质心数据),都是坐标数据的二维矩阵,
所以我们需要把二维矩阵转换为张量数据,那么如何进行转换呢?
我们需要使用reshape()函数。
3 使用reshape()函数将矩阵转换为张量
这里我们以二维坐标数据为例,来阐述一下转换的过程,
首先我们来看看X的数据形式,
X 300x2 double,300*2的二维矩阵,每行记录了样本点的坐标数据
centroids 3x2 double, 3*2的二维矩阵, 每行记录了质心的坐标数据
因为需要转换为张量,我们对转换的目标张量做如下定义,
定义一个3D的张量,其大小为m*K*D,这里m指的是样本点的数量,K指的是需要分类的类别(也就是质心的数量),D指的是样本数据的维度,这里就是2,也就是是X和Y坐标构成的二维坐标;
可以想象得到,矩阵就类似于张量的一层,∴我们的想法是首先把矩阵复制到张量的层对应的位置上,然后再用repmat()函数将层进行复制扩充,从而形成张量;
将矩阵转换为张量的步骤如下:
- 使用reshape()函数将矩阵转换为张量的一层;
- 再使用repmat()函数将层进行复制,扩充形成张量。
这里将矩阵X扩充成张量的示例代码如下:
m = size(X,1);
% 构造X对应的张量
Tensor_X = reshape(X,m,1,size(X,2));
Tensor_X = repmat(Tensor_X,1,K,1);