作者Berger927 (rabbit)
看板MATLAB
标题Re: [问题] 矩阵正规化多出一堆NaN Inf
时间Sat Mar 10 11:10:01 2012
※ 引述《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取代
看你自己的需求搂...
--
1F:推 ttttt40 :原来我有恋童癖阿...(望向千元钞...02/06 15:45
2F:推 jkn26 :我为什麽比较喜欢鱼 (望向两千元钞...02/06 16:42
3F:→ evilgogo :原来我的鱼控是这样来的啊…(望楼上…02/06 16:55
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.255.0.111
4F:推 seedman:这样子意义一样吗? 03/10 14:18
5F:→ Berger927:哎呀... 就数学上当然不严谨... 但你都拿zscore来对照了 03/10 19:16
6F:→ Berger927:我还能说什麽呢? 一切都是看你的需求阿... 03/10 19:17
不然我把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)
7F:→ seedman:感谢你的原始码 我在研究研究 03/11 08:07