【问题标题】:Z-scores using specified mu and sigma使用指定 mu 和 sigma 的 Z 分数
【发布时间】:2013-09-15 15:54:25
【问题描述】:

我已将每一列的训练数据矩阵转换为z-scores。对于zscore 的输出中的每一列,我都有musigma

我还有另一个矩阵(我的测试数据),我想使用在上一步中获得的musigma 将其转换为 z-scores。我的实现使用for 循环,如下所示:

TEST_DATA = zeros(num_rows,num_cols,'double');

for rowIdx = 1:num_rows,
    for colIdx = 1:num_cols,
        TEST_DATA(rowIdx,colIdx)=(input(rowIdx,colIdx)-MU(colIdx))/SIGMA(colIdx);
    end
end

在 MATLAB 中有没有更快的方法来实现这一点?

【问题讨论】:

  • 更具体。解释 z 分数是什么,并解释您想对数据执行什么操作。
  • @Peter 请参阅编辑后的 ​​OP

标签: matlab machine-learning normalization scaling


【解决方案1】:

zscore 的文档解释说它只是简单地减去平均值并除以标准差。唯一棘手的部分是将 mu/sigma 的向量应用于每一列。但是,如果您不知道如何使用花哨的方式,请使用 for 循环。为了便于阅读,我将保持这种方式。如果您需要更快,请查看bsxfun

for ii=1:size(mat,1)
    mat(ii,:) = (mat(ii,:) - mu) ./ sigma;
end

【讨论】:

    【解决方案2】:

    你可以使用bsxfun:

    %// Sample data
    matrix = rand(10, 10);
    testData = rand(10, 10); 
    
    %// Obtain mu and sigma
    mu = mean(matrix, 1);
    sigma = std(matrix, [], 1);
    %// or use: [Z, mu, sigma] = zscore(matrix);
    
    %// Convert into z-scores using precalculated mu and sigma
    C = bsxfun(@rdivide, bsxfun(@minus, testData, mu), sigma);
    

    【讨论】:

    • +1:您可以使用@rdividesigma,而不是@times1 ./ sigma
    • @H.Muster 如果我错了,请纠正我...bsxfun 在矩阵的所有元素(行 * 列)上运行,可用于替换 2 个 for 循环,如我的示例OP中的代码?
    • @EitanT:谢谢你提醒我。我主要使用@times,因为我总是忘记@rdivide@ldivide 是否是必要的。感谢您添加 cmets 和链接。
    • @KhurramMajeed: 是的,每个bsxfun 替换一个循环,但如果我没记错的话,它们不会在单个元素上运行,而是在 testData 的每一行上运行。
    • @H.Muster 你确实是对的。这是一个相关的问题:Is bsxfun really applied element-wise?
    猜你喜欢
    • 2012-02-10
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2015-02-06
    • 2020-05-20
    • 2015-03-25
    相关资源
    最近更新 更多