【问题标题】:Matlab Covariance Matrix Computation for Different Classes不同类的Matlab协方差矩阵计算
【发布时间】:2011-11-13 10:31:23
【问题描述】:

我有 2 个不同的文件,其中一个是具有 3823*63 个元素(3823 个输入和 63 个特征)的输入矩阵 (X),另一个是具有 3823*1 的类向量 (R)元素;这些元素的值从 0 到 9(有 10 个类)。

我必须为每个类计算协方差矩阵。到目前为止,我只能为每个具有这么多嵌套循环的类计算平均向量。然而,它导致我脑死亡。

还有其他简单的方法吗?


有我的目的的代码(感谢 Sam Roberts):

xTra = importdata('optdigits.tra');
xTra = xTra(:,2:64); % first column's inputs are all zero

rTra = importdata('optdigits.tra');
rTra = rTra(:,65); % classes of the data

c = numel(unique(rTra));

for i = 1:c
    rTrai = (rTra==i-1); % Get indices of the elements from the ith class
    meanvect{i} = mean(xTra(rTrai,:)); % Calculate their mean
    covmat{i} = cov(xTra(rTrai,:)); % Calculate their covariance
end

【问题讨论】:

  • 你确定这是必要的吗?您可能想到了一个完全不同的应用程序,如果是这样,请与我分享,但我不熟悉使用类标签计算协方差。例如,我计算一个 cov 矩阵作为 PCA 的谓词步骤,但所需的结果只是一个二维矩阵 (n x n),给出了特征的成对协方差(这是我计算特征向量所需的全部)。 i/o/w 不需要类标签。
  • @doug 我要编辑问题并再添加一个标签。

标签: matlab machine-learning covariance


【解决方案1】:

这能满足你的需要吗?

X = rand(3263,63);
R = randi(10,3263,1)-1;

numClasses = numel(unique(R));

for i = 1:numClasses
    Ri = (R==i); % Get indices of the elements from the ith class
    meanvect{i} = mean(X(Ri,:)); % Calculate their mean
    covmat{i} = cov(X(Ri,:)); % Calculate their covariance
end

此代码循环遍历每个类,选择 R 中与该类中的观察相对应的行,然后从 X 中获取相同的行并计算它们的均值和协方差。它将它们存储在一个元胞数组中,因此您可以像这样访问结果:

% Display the mean vector of class 1
meanvect{1}

% Display the covariance matrix of class 2
covmat{2}

希望有帮助!

【讨论】:

  • 电脑之神圣母,这是什么魔法?非常感谢!
  • 是的 - 通常 MATLAB 的意义在于它使您不必执行所有嵌套的 for 循环。矩阵计算是内置的!
  • 我之前使用过 mean 和 cov 函数,但我没有在单元结构中使用它们。再次感谢您的回答并教我如何使用细胞。
【解决方案2】:

不要使用meansum 作为变量名,因为它们是有用的Matlab 内置函数的名称。 (输入doc meandoc sum获取使用帮助)

cov 还会为您计算协方差矩阵。

您可以使用逻辑索引来提取示例。

covarianceMatrices = cell(m,1);
for k=0:m-1
    covarianceMatrices{k} = cov(xTra(rTra==k,:));
end

单线

covarianceMatrices = arrayfun(@(k) cov(xTra(rTra==k,:)), 0:m-1, 'UniformOutput', false);

【讨论】:

    【解决方案3】:

    首先为每个类构造数据矩阵。 其次计算每个数据矩阵的协方差。

    下面的代码就是这样做的。

    % assume allData contains all the data you've read in, each row is one data point
    % assume classVector contains the class of each data point
    numClasses = 10;
    data = cell(10,1);       %use cells to store each of the data matrices
    covariance = cell(10,1); %store each of the class covariance matrices
    [numData dummy] = size(allData);
    
    %get the data out of allData and into each class' data matrix
    %there is probably a nice matrix way to do this, but this is hopefully clearer
    for i = 1:numData
      currentClass = classVector(i) + 1; %Matlab indexes from 1
      currentData = allData(i,:);
      data{currentClass} = [data{currentClass}; currentData];
    end
    
    %calculate the covariance matrix for each class
    for i = 1:numClasses
      covariance{i} = cov(data{i});
    end
    

    【讨论】:

    • 是的,Sam Roberts 解决方案在上面显示了漂亮的矩阵索引。
    猜你喜欢
    • 2012-11-22
    • 2020-04-13
    • 1970-01-01
    • 2013-06-30
    • 2015-03-31
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多