Поиск:

Ответ в темуСоздание новой темы Создание опроса
> расстояние Махаланобиса, как вычислить? 
:(
    Опции темы
Mast
Дата 5.10.2005, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.10.2005

Репутация: нет
Всего: нет



Всем доброго времени!
А не подскажите-ли формулу или алгоритм для вычисления расстояния Махаланобиса?
PM MAIL   Вверх
podval
Дата 6.10.2005, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 18
Всего: 62



Сверху страницы есть меню "Поиск". Это поиск по форуму.

Вот что можно найти:
http://forum.vingrad.ru/index.php?act=Sear...%EE%E1%E8%F1%E0
PM WWW ICQ   Вверх
Guest
Дата 6.10.2005, 13:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо.
  Вверх
Mast
Дата 9.10.2005, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.10.2005

Репутация: нет
Всего: нет



Спасибо за формулу:
Цитата
Расстояние Махаланобиса:

Dm = [(X1-X2)'*inv(S)*(X1-X2)],

где X1, X2 - векторы средних для матриц М1 и М2,
S - объединенная ковариационная матрица,
inv - операция обращения матриц,
' - операция транспонирования.

Объединенная ковариационная матрица считается так:

S = (Cov1 + Cov2)/(n1 + n2 - 2),

где Cov1 = M1'*M1, Cov2 = M2'*M2.
n1, n2 - длины X1, X2.


Попытался ее реализовать, но столкнулся с такой ... м-м-м...

Получается что мы транспонируем вектор перед матрицей, и вместо строки у нас получается столбец (так ?), но все мои источники smile , включая матлаб и статистику говорят, что это невозможно (по правилу умножения матриц).
Не могли бы вы пояснить, в чем здесь дело.
В help к статистике столкнулся с формулой, где транспонируется второй вектор, после матрицы.


PM MAIL   Вверх
podval
Дата 9.10.2005, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 18
Всего: 62



Цитата(Mast @ 9.10.2005, 17:44)
Получается что мы транспонируем вектор перед матрицей, и вместо строки у нас получается столбец

Нет. Вектор - это столбец. Поэтому при его транспонировании получается строка.
PM WWW ICQ   Вверх
Mast
Дата 9.10.2005, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.10.2005

Репутация: нет
Всего: нет



А, ну тогда все ясно. smile
Кроме формулы в статистике... smile
Если кому интересно, то вот реализация:
мнения и найденные ошибки приветствуются smile
Код

{ Здесь некоторая избыточность в переменных
   это только для этапа разработки
}
type TMatrix = array of array of double;
        TVector = array of double;

function Mahalanobis2(const et, eksp : TMatrix):double; // эталон, эксперимент
var
  etl, exp, cov1, cov2, s : TMatrix; // эталон и эксперимент
  x1, x2, tmpx, tmpy : TVector; // векторы средних
  ai,aj, bi,bj, ci,cj, i,j : integer;
  colcount, rowcountexp, rowcountetl : integer;
 begin
  ErrorMatrix:=false;
  result:=-1;//error
  rowcountetl:=RowMatrix(et);// количество строк матрицы
  rowcountexp := RowMatrix(eksp);// bi
  aj:=ColMatrix(et); bj:=ColMatrix(eksp); // количество столбцов матрицы
  if aj<>bj then
   begin
    Messages('Mahalanobis: Количество столбцов у матриц не эквивалентно!');
    result:=-1;
    ErrorMatrix:=True;
    Exit;
   end;
  etl:=CloneMatrix(et); // создание точной копии матрицы
  exp:=CloneMatrix(eksp);
  if ErrorMatrix then Exit; //произошла ошибка при клонировании

  colcount:=ColMatrix(exp); // просто для удобства

  x1:=CreateVector(colcount);
  x2:=CreateVector(colcount);
  tmpx:=CreateVector(rowcountetl);
  tmpy:=CreateVector(rowcountexp);
  for i:=0 to colcount-1 do
   begin
    for j:=0 to rowcountetl-1 do //вычисляем вектора средних
      tmpx[j]:=etl[j,i];
    for j:=0 to rowcountexp-1 do
      tmpy[j]:=exp[j,i];

    x1[i]:=mean(tmpx);
    x2[i]:=mean(tmpy);

    for j:=0 to rowcountetl-1 do  //центрируем матрицы
      etl[j,i]:=etl[j,i]-x1[i];
    for j:=0 to rowcountexp-1 do
      exp[j,i]:=exp[j,i]-x2[i];
   end;

  SetLength(tmpx,0);
  SetLength(tmpy,0);
  cov1:=MultMatrix(TransMatrix(etl),etl); // умножение и транспонирование матриц
  cov2:=MultMatrix(TransMatrix(exp),exp);
  
  s:=CMultMatrix((1/(rowcountetl+rowcountexp-2)),SumMatrix(cov1,cov2)); // умножение на скаляр и суммирование матриц
  SetLength(cov1,0);
  SetLength(cov2,0);
  cov1:=ReversMatrix(s);// обращаем матрицу
  Setlength(s,0);
  s:=cov1;  // просто для удобства

  tmpx:=SubVector(x1,x2);// разница векторов
  ci:=ColMatrix(s);
  cj:=RowMatrix(s);
 SetLength(tmpy, cj);  // первое умножение матрицы на вектор
  for i:=0 to ci-1 do
   begin
    tmpy[i]:=0;
    for j:=0 to cj-1 do
     tmpy[i]:=tmpy[i]+s[i,j]*tmpx[j];
   end;
  result:=MultSVector(tmpy,tmpx); // умножение вектора на вектор

  SetLength(s,0);
  SetLength(tmpx,0);
  setLength(tmpy,0);
  setLength(x1,0);
  SetLength(x2,0);
 end; //function Mahalanobis2


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0601 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.