Re: [問題] 矩陣正規化多出一堆NaN Inf
※ 引述《seedman (cc)》之銘言:
: 我用
: [m n] = size(X);
: X = (X - ones(m,1)*mean(X))./(ones(m,1)*std(X));
^^^^^
: 但是這樣X裡面會多出一堆NaN Inf
: 讓我後續的svd不能用
: 可是如果我用zscore(X)就不會有這種情況
: 請問第一種寫法要怎麼改才會對?
因為你有除法 設定上除以0本來就容易出現這些狀況
簡便的作法是std(X)先行另外做,有0再依據你的定義看如何處理
如果你硬要縮成一行 我記得有個函數或是寫法比較好看 但熊熊想不起來
難看一點的寫法就變成這樣了
X1 = (X - ones(m,1)*mean(X))./(ones(m,1)* ( (std(X)==0) + std(X) ) )
上面的作法是把0的地方取代為1 就不易出現這個問題了...
但上面寫法仍然需要注意精確度的問題 建議還是一步一步判斷比較實際
有時候貪圖字面上的簡潔也不是很好
zscore(X)本身的做法也是一步一步判定有沒有問題
設定上也是將std為0的地方用1取代
看你自己的需求摟...
--
推
02/06 15:45,
02/06 15:45
推
02/06 16:42,
02/06 16:42
→
02/06 16:55,
02/06 16:55
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.255.0.111
推
03/10 14:18, , 1F
03/10 14:18, 1F
→
03/10 19:16, , 2F
03/10 19:16, 2F
→
03/10 19:17, , 3F
03/10 19:17, 3F
不然我把zscore部分code拿出來你自己看看是不是你要的吧...
天知道你是拿它來做什摸呢?
function z = zscore(x)
if isequal(x,[]), z = []; return; end
sz = size(x);
dim = find(sz ~= 1, 1);
if isempty(dim), dim = 1; end
tile = ones(1,ndims(x)); tile(dim) = sz(dim);
warn = warning('off','MATLAB:divideByZero');
xbar = repmat(mean(x), tile);
sd = repmat(std(x), tile);
warning(warn)
sd(sd==0) = 1;
z = (x - xbar) ./ sd;
自行參照摟...
※ 編輯: Berger927 來自: 111.255.0.111 (03/10 19:23)
→
03/11 08:07, , 4F
03/11 08:07, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):