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);

 

 

 

 

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