2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 МНК для плоскости.
Сообщение12.10.2010, 09:57 
Здравствуйте. У меня есть облако точек в 3-х мерном пространстве и мне необходимо вписать плоскость по МНК. Почему то нигде алгоритма не нашел, а как сделать МНК для трехмерного случая не знаю, может кто подскажет метод?

 
 
 
 Re: МНК для плоскости.
Сообщение12.10.2010, 10:04 
Вам надо найти аппроксимирующую функцию $z=Ax+By+C$ -- или переменные $x,y,z$ равноправны? Это две совершенно разные задачи.

 
 
 
 Re: МНК для плоскости.
Сообщение12.10.2010, 10:19 
Ну да, я сделал обычный мнк, то есть минимизировал сумму квадратов отклонений для этой функции $z=Ax+By+C$, где A B C коэффициенты которые нужно найти. Получилось уравнение прямой в трехмерном пространстве.

 
 
 
 Re: МНК для плоскости.
Сообщение12.10.2010, 10:30 
luckydevil в сообщении #361228 писал(а):
Получилось уравнение прямой в трехмерном пространстве.

Какая ж это прямая, когда это плоскость.

 
 
 
 Re: МНК для плоскости.
Сообщение12.10.2010, 10:35 
Аватара пользователя
Здесь было.

 
 
 
 Re: МНК для плоскости.
Сообщение12.10.2010, 11:07 
Прямая, это потому что я неправильно x,y подставил. Но сейчас тоже не работает:
Возвел в квадрат, нашел частные производные, получил систему

$
\left\{ \begin{array}{l}
a\sum x^2+b\sum xy+c\sum x-\sum  xz,\\
a\sum xy+b\sum y^2+c\sum y-\sum  yz,\\
a\sum x+b\sum y+cN-\sum  z,
\end{array} \right.
$
Попробовал в Матлабе
Код:
x=1:10;
x=ones(10,1)*x;
y=1:2:20;
y=ones(10,1)*y;
y=y';
z=1*x+2*y+3;
X=sum(sum(x));
Y=sum(sum(y));
Z=sum(sum(z));
X2=sum(sum(x.*x));
XY=sum(sum(x.*y));
XZ=sum(sum(x.*z));
Y2=sum(sum(y.*y));
YZ=sum(sum(z.*y));
A=[X2 XY X;XY Y2 Y;X Y 10];
f=[XZ YZ Z]';
r=A\f

 
 
 
 Re: МНК для плоскости.
Сообщение12.10.2010, 11:22 
luckydevil в сообщении #361240 писал(а):
Код:
x=1:10;
x=ones(10,1)*x;
y=1:2:20;
y=ones(10,1)*y;
y=y';
z=1*x+2*y+3;

В-первых, это нелепо -- зачем Вам матрицы с данными, да ещё и дублирующими друг друга. Во-вторых, и не может работать: все точки у Вас лежат на одной прямой, поэтому МНК на таких данных некорректен (система получится вырожденной).

 
 
 
 Re: МНК для плоскости.
Сообщение12.10.2010, 11:48 
И правда, бред. Я пробовал и векторы с данными, и так чтобы точки не лежали на прямой.
Для прямой все работает. А для плоскости не знаю как. Вот как для прямой:
Код:
x=1:10;
y=1:2:20;
z=1*x+2*y+3+rand(1,10)*5;
X=(sum(x));
Y=(sum(y));
Z=(sum(z));
X2=(sum(x.*x));
XY=(sum(x.*y));
XZ=(sum(x.*z));
Y2=(sum(y.*y));
YZ=(sum(z.*y));
Z2=sum(z.*z);
A=[X2 XY X;XY Y2 Y;X Y 10]
% A=[X2 XY XZ;XY Y2 YZ;XZ XY Z2];
f=[XZ YZ Z]';
r=A\f

figure, plot3(x,y,z,x,y,r(1)*x+r(2)*y+r(3))

 
 
 
 Re: МНК для плоскости.
Сообщение12.10.2010, 12:07 
А Вас не настораживает сообщение, которое выдаёт Матлаб:

Код:
Warning: Matrix is close to singular or badly scaled.
         Results may be inaccurate. RCOND = 9.057764e-018.
?

И действительно, матрица ну просто жутко singular, причём не случайно. Эта матрица вообще никакого отношения к МНК не имеет.

 
 
 
 Re: МНК для плоскости.
Сообщение13.10.2010, 20:26 
Задача довольно простая.
Вам нужно минимизировать сумму $$\sum (A x_i + B y_i +Cz_i + D)^2 \text{~~при условии~~} A^2+B^2+C^2=1.$$ (Именно при этом условии указанная сумма есть сумма квадратов отклонений от плоскости.) Поиск условного минимума --- известная в матане задачка. В системе цетра тяжести точек получим с необходимостью $D=0$, и задача сведётся к поиску собственных значений матрицы М из сообщения, на которое Вам уже указали. Чисто решить кубическое уравнение. Нужно взять наименьшее собственное значение; соотв. собственный вектор --- искомый вектор $(A,B,C)$.

 
 
 
 Re: МНК для плоскости.
Сообщение05.09.2021, 19:18 
Недавно самому надо было сделать эту задачу ... решения НИГДЕ нормального не нашел, пришлось самому вникать .
Вот работающий код для матлаба
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
clear;
clc;
%(1, 1, 7), (1, 2, 9), (2, 1, 10), (2, 2, 11), (2, 3, 12). собственно наши измерения с неточностями
x = [1 1 2 2 2]'
y = [1 2 1 2 3]'
z = [7 9 10 11 12]'
% поделим ур-е плоскости на коэф с не равный нулю a/c*x + b/c*y +z +d/c=0
A = [x(1) y(1) 1;
    x(2) y(2) 1;
    x(3) y(3) 1;
    x(4) y(4) 1;
    x(5) y(5) 1];
b0 = [-z(1),- z(2),-z(3),-z(4),-z(5)]'
xr=A\b0
norm(A)*norm(A') % число обусловленностей
res1=xr(1) % a/c (*)
res2=xr(2) % b/c (**)
res3=xr(3) % d/c
%a^2+b^2+c^2=1 (***), осталось только решить систему из ур-ий
%(*),(**),(***) чтобы найти a,b,c , после чего d=res3*c

 i  Pphantom:
Поздновато, но пусть будет, только код надо бы оформлять с использованием соответствующего тэга. Поправил.

 
 
 [ Сообщений: 11 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group