Java SVD с JAMA или еще - PullRequest
       51

Java SVD с JAMA или еще

2 голосов
/ 25 января 2012

У меня есть облако очков, и мне нужна лучшая подходящая линия. Я использую JAMA, но я не знаю почему, что-то не работает. Вероятно, это я, кто не понимает, как это работает. У меня есть Матрица Nx3 (это то, что поддерживает JAMA SVD), и я получаю правильную Матрицу V от Svd. Вектор, который мне нужен, - это правильный единственный вектор (строка или столбец?), Соответствующий наибольшему единственному значению. Этот вектор должен представлять основное направление.

Предполагается, что каждый вектор имеет наибольшее положительное значение y, x может быть как положительным, так и отрицательным, а z - отрицательным. Но иногда вектор, который я получаю, имеет отрицательное значение y, или в любом случае он указывает в неправильном направлении.

Мое облако точек довольно регулярное, все они расположены почти вдоль оси y (с z маленьким и отрицательным). Таким образом, основное направление должно быть действительно легко найти. Но он все еще не работает должным образом.

В этом случае я получаю вектор строки (я тоже пробовал вектор столбца) правой Матрицы V. Я уже вычел центроид из "pointSet".

public static Matrix bestDirection(Matrix pointSet){

    Matrix bestFittingLine = new Matrix(3,1);
    SingularValueDecomposition svd = pointSet.svd();

    bestFittingLine.set(0, 0, svd.getV().get(0, 0));
    bestFittingLine.set(1, 0, svd.getV().get(0, 1));
    bestFittingLine.set(2, 0, svd.getV().get(0, 2));

    return bestFittingLine;
}

Я думаю, может быть, я не рассматриваю что-то. ИДК, может быть, я должен использовать другую технику или другую библиотеку.

Ответы [ 2 ]

1 голос
/ 26 января 2012

Из Википедии о SVD:

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

Проще говоря, нельзя полагаться на знак выходных сингулярных векторов.

Вам также может понадобиться центрировать данные перед SVD.

Почему вы не будете выполнять регрессию?

0 голосов
/ 25 января 2012

Если ваше уравнение имеет следующий вид:

z = a0 + a1*x + a2*y

Ваше матричное уравнение выглядит следующим образом для N точек:

z(i) = a0 + a1*x(i) + a2*y(i)  i = 1, N

Левая часть - это вектор Nx1;правая часть представляет собой матрицу Nx3, умножающую неизвестный вектор, который равен 3x1.

Умножьте обе стороны на A (транспонирование), и вы получите матрицу 3x3, умножающую вектор 3x1 с неизвестными коэффициентами, который равен вектору 3x1,Используйте стандартные матричные решения для решения неизвестных коэффициентов.Это было бы легко сделать даже в закрытом виде.

Это упрощенное линейное решение для наименьших квадратов.Вот документ scribd , который объясняет его более подробно.

...