Вычисление ковариационной матрицы Matlab для разных классов - PullRequest
1 голос
/ 13 ноября 2011

У меня есть 2 разных файла, один из которых представляет собой матрицу ввода (X), которая имеет 3823 * 63 элемента (3823 ввода и 63 объекта), а другой - вектор класса (R), который имеет 3823 * 1элементы;эти элементы имеют значения от 0 до 9 (есть 10 классов).

Я должен вычислить ковариационные матрицы для каждого класса.До сих пор я мог вычислять только средние векторы для каждого класса с таким количеством вложенных циклов.Тем не менее, это приводит меня к смерти мозга.

Есть ли другой простой способ?


Есть код для моей цели (спасибо Сэму Робертсу):

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

Ответы [ 3 ]

2 голосов
/ 13 ноября 2011

Делает ли это то, что вам нужно?

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}

Надеюсь, это поможет!

1 голос
/ 13 ноября 2011

Не используйте mean и sum в качестве имен переменных, поскольку они являются именами полезных встроенных функций Matlab.(Введите doc mean или doc 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);
0 голосов
/ 13 ноября 2011

Сначала создайте матрицу данных для каждого класса. Затем вычислите ковариацию для каждой матрицы данных.

Код ниже делает это.

% 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
...