MATLAB————用reshape()函数将矩阵转换为张量

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()函数将层进行复制扩充,从而形成张量;

将矩阵转换为张量的步骤如下:

  1. 使用reshape()函数将矩阵转换为张量的一层;
  2. 再使用repmat()函数将层进行复制,扩充形成张量。

这里将矩阵X扩充成张量的示例代码如下:

m  = size(X,1);
% 构造X对应的张量
Tensor_X = reshape(X,m,1,size(X,2));
Tensor_X = repmat(Tensor_X,1,K,1);

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章