簡體   English   中英

scale()R函數等效於Octave / Matlab

[英]scale() R function equivalent in Octave/Matlab

避免循環,是否有一種方法可以使數據矩陣圍繞列(或行)的平均值居中,並按標准偏差(按列或按行)縮放每個條目?

在R中這很容易: scale(data, center = T, scale = T))

但是我不知道如何在Ocatave或Matlab中實現相同的基本預處理。

在Octave中,此center()和zscore()具有兩個功能。 中心僅減去平均值,而zscore也除以sd(這種操作有時稱為標准化)

中心(x)

通過減去平均值來居中數據。

如果x是向量,則減去其平均值。 如果x是矩陣,請對每列執行上述操作。 如果給出了可選參數dim,則沿該維進行操作。

zscore(x,opt,dim)計算x的Z得分

如果x是向量,則減去其平均值並除以其標准偏差。 如果標准偏差為零,則除以1。

可選參數opt確定計算標准偏差時要使用的歸一化,並且具有與std的相應參數相同的定義。

如果x是矩陣,則沿第一個非單維度進行計算。 如果給定了第三個可選參數dim,則沿該維進行操作。

沒有一個函數可以執行此操作,但是您可以為std使用dim參數,並mean要執行此操作。 我們還可以使用bsxfun將其全部包裝為一行。

A = rand(5, 4);

% Column-wise
bsxfun(@rdivide, bsxfun(@minus, A, mean(A, 1)), std(A, [], 1))

% Row-wise  
bsxfun(@rdivide, bsxfun(@minus, A, mean(A, 2)), std(A, [], 2))

說明

使用dim參數mean我們可以計算A每一列的平均值。

M = mean(A, 1)

然后,我們可以使用bsxfun從每列中的每個值中減去平均值( @minus )。 我們需要使用bsxfun因為M1 x nColsAnRows x nCols bsxfun將自動為我們廣播操作。

B = bsxfun(@minus, A, M);

然后,我們要再次使用dim參數(第三輸入)來計算每列的標准偏差。

S = std(A, [], 1)

並將每列除以該標准差

bsxfun(@rdivide, B, S);

因此,將所有這些整合在一起

bsxfun(@rdivide, bsxfun(@minus, A, mean(A, 1)), std(A, [], 1))

要執行逐行操作,我們要做的就是將dim參數從1(列)切換為2(行)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM