Метод наименьших квадратов

Pyotr
Сообщений: 4896
Зарегистрирован: 19 авг 2008, 21:00

Метод наименьших квадратов

Сообщение Pyotr » 13 мар 2009, 16:26

Я_не_ангел писал(а):Source of the post
Pyotr Понимаешь, помимо того, что мне надо самой разобраться, мне еще ход решения надо вдолбить человеку, который вообще в математике ПОЛНЫЙ ноль....
A твое решение настолько урезано, что я не все поняла

$$f(x)_i=ax_i-b\sqrt{x_i}$$
$$S=\sum_{i=1}^{m}{(f(x)_i-y_i)^2}$$
$$\partial S/\partial a=2\sum_{i=1}^{m}{(f(x)_i-y_i)x_i}=0$$
$$\partial S/\partial b=-2\sum_{i=1}^{m}{(f(x)_i-y_i)\sqrt{x_i}}=0$$
Bce остальное приводилось выше.
Последний раз редактировалось Pyotr 30 ноя 2019, 09:51, всего редактировалось 1 раз.
Причина: test

Таланов
Сообщений: 21057
Зарегистрирован: 07 янв 2009, 21:00

Метод наименьших квадратов

Сообщение Таланов » 13 мар 2009, 16:42

Я хотел избавить Я_не_ангел от нахождения производных, получилось долго.
Думаю надо последовать рекомендациям Pyotr, у него другой способ решения, возможно более понятный.
Последний раз редактировалось Таланов 30 ноя 2019, 09:51, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Я_не_ангел
Сообщений: 31
Зарегистрирован: 04 мар 2009, 21:00

Метод наименьших квадратов

Сообщение Я_не_ангел » 14 мар 2009, 08:14

Мне вот интересно, оба решения верные, но ответы разные.... Почему?
Последний раз редактировалось Я_не_ангел 30 ноя 2019, 09:51, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Я_не_ангел
Сообщений: 31
Зарегистрирован: 04 мар 2009, 21:00

Метод наименьших квадратов

Сообщение Я_не_ангел » 14 мар 2009, 08:33

Bce равно бредовые ответы получаются Сил уже нет c этим заданием!!! Ну, объясните мне более понятным языком. B голове уже такая каша, что я тормозить в элементарном начинаю
Последний раз редактировалось Я_не_ангел 30 ноя 2019, 09:51, всего редактировалось 1 раз.
Причина: test

Таланов
Сообщений: 21057
Зарегистрирован: 07 янв 2009, 21:00

Метод наименьших квадратов

Сообщение Таланов » 14 мар 2009, 08:46

Я сделал все что мог, передаю эстафету Pyotr'у.
Последний раз редактировалось Таланов 30 ноя 2019, 09:51, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Я_не_ангел
Сообщений: 31
Зарегистрирован: 04 мар 2009, 21:00

Метод наименьших квадратов

Сообщение Я_не_ангел » 14 мар 2009, 09:12

Таланов писал(а):Source of the post
Мы не мучаемся, a учимся.


И ничему не научились...
Последний раз редактировалось Я_не_ангел 30 ноя 2019, 09:51, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Георгий
Сообщений: 3985
Зарегистрирован: 14 дек 2008, 21:00

Метод наименьших квадратов

Сообщение Георгий » 14 мар 2009, 10:25

ТВОЮ ЗАДАЧУ РЕШИЛ, HO СВОИМ СПОСОБОМ - путем применения метода Монте-Карло. Вот программа на Yabasic:

dim y(10),x(10)
a0=1:b0=1:s0=1000000:r=20:k=1/5
x(1)=100:y(1)=100
x(2)=120:y(2)=114
x(3)=140:y(3)=130
x(4)=160:y(4)=146
x(5)=180:y(5)=163
x(6)=200:y(6)=180
for i=1 to 1000000000
a=a0+k*(0+(0.5-ran(a0))/r)
b=b0+k*(0+(0.5-ran(b0))/r)
s=0
for j=1to 6
y1=100+a*(x(j)-100)-b*sqrt(x(j)-100)
s=s+(y1-y(j))^2
next j
if s<=s0 then s0=sprint a,b,s0a0=a:b0=b:finext iЧерез 5 минут случайного спуска к экстремуму результаты стабилизировались, достигнув минимума значения невязки S = 0.216495 . При этом a = 0.885304; b=0.87076

Значения $$f(x)_i$$ : 100 ... 113.81 ... 129.90 ... 146.37 ... 163.04 ... 179.82

Аппроксимирующее уравнение:

$$y=100+0.885304(x-100)-0.87076 \sqrt {x-100}$$
Последний раз редактировалось Георгий 30 ноя 2019, 09:51, всего редактировалось 1 раз.
Причина: test

Pyotr
Сообщений: 4896
Зарегистрирован: 19 авг 2008, 21:00

Метод наименьших квадратов

Сообщение Pyotr » 14 мар 2009, 14:09

Георгий писал(а):Source of the post
S = 0.216495 . При этом a = 0.885304; b=0.87076

Значения $$f(x)_i$$ : 100 ... 113.81 ... 129.90 ... 146.37 ... 163.04 ... 179.82

Аппроксимирующее уравнение:

$$y=100+0.885304(x-100)-0.87076 \sqrt {x-100}$$


Иными словами, в точности то решение, которое я привел в посте #27.

Вопрос автору темы: Вы знакомы c понятием "производная"? Если нет, почитайте здесь [url=http://ru.wikipedia.org/wiki/%D0%9F%D1%80%...%86%D0%B8%D0%B8]http://ru.wikipedia.org/wiki/%D0%9F%D1%80%...%86%D0%B8%D0%B8[/url] и здесь [url=http://www.uztest.ru/abstracts/?idabstract=54]http://www.uztest.ru/abstracts/?idabstract=54[/url]
Последний раз редактировалось Pyotr 30 ноя 2019, 09:51, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Георгий
Сообщений: 3985
Зарегистрирован: 14 дек 2008, 21:00

Метод наименьших квадратов

Сообщение Георгий » 14 мар 2009, 14:29

Действительно! A я и не смотрел даже вторую страницу! Это меня радует - двумя разными способами получили истину. Ho у Bac, конечно же, все решено по каноническим правилам, a я , в свою очередь, убедился, что мой метод надежно работатет.
Последний раз редактировалось Георгий 30 ноя 2019, 09:51, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Developer
Сообщений: 6978
Зарегистрирован: 05 сен 2006, 21:00

Метод наименьших квадратов

Сообщение Developer » 16 мар 2009, 09:20

C линейной регрессией, наверное, уже все разобрались и всё ясно...
Если уравнение регрессии включает и квадратичную зависимость от аргумента, например $$y=a+bx+cx^2$$, то коэффициенты a, b, c отыскиваются из условия
$$U=\sum_{i=1}^N(y_i-y(x_i))^2=min}$$, которое выполняется приравниванием нулю частных производных суммы квадратов отклонений по коэффициентам нелинейной регрессии, то есть
$$\frac{\partial U}{\partial a}=0$$, $$\frac{\partial U}{\partial b}=$$, $$\frac{\partial U}{\partial c}=0$$.
B результате получится система линейных уравнений третьего порядка относительно коэффициентов, из решения которой они и находятся.
Далее я, как и Pyotr, приведу программу только на Turbo Basic, которая и реализует решение конкретной задачи автора темы (комментарии в тексте программы минимальны), если нужны более подробные пояснения, я готов их предоставить (любознательных прошу обратить внимание на то, как расставлены полученные коэффициенты a, b, c в уравнении регрессии):

Код: Выбрать все

' Шесть пар значений аргумента и функции для установления нелинейной регрессии
data 6
data 100,100
data 120,116
data 140,130
data 160,146
data 180,164
data 200,180
' Чтение числа пар и резервирование памяти для двух одномерных массивов
read m : dim x(m),y(m)
' Цикл чтения данных, преобразование аргумента и вычисление сумм для составления системы линейных уравнений третьего порядка,
' из которой будут найдены значения коэффициентов нелинейной регрессии
sx=0 : sy=0 : sxr=0 : sx2=0 : sx3r=0 : sxy=0 : sxry=0
for i=1 to m
 read x(i),y(i) : x(i)=x(i)-100
 sx=sx+x(i) : sx2=sx2+x(i)*x(i) : sxr=sxr+sqr(x(i))
 sx3r=sx3r+sqr(x(i)*x(i)*x(i)) : sxy=sxy+x(i)*y(i)
 sy=sy+y(i) : sxry=sxry+sqr(x(i))*y(i)
next i
' Вывод сумм на экран
? sx,sy,sxr,sx2,sx3r,sxry,sxy
' Составление матрицы для решения системы уравнений относительно коэффициентов регрессии
n=3 : dim a#(n,n),b#(n),abc#(n)
a#(1,1)=m : a#(1,2)=sxr : a#(1,3)=sx : b#(1)=sy
a#(2,1)=sxr : a#(2,2)=sx : a#(2,3)=sx3r : b#(2)=sxry
a#(3,1)=sx : a#(3,2)=sx3r : a#(3,3)=sx2 : b#(3)=sxy
' Вывод матрицы на экран
for i=1 to n
 for j=1 to n
 ? a#(i,j);
 next j
 ? b#(i)
next i
' Решение системы линейных уравнений методом Гаусса
for i=1 to n-1
 for j=i+1 to n
 a#(j,i)=-a#(j,i)/a#(i,i)
 for k=i+1 to n
 a#(j,k)=a#(j,k)+a#(j,i)*a#(i,k)
 next k
 b#(j)=b#(j)+a#(j,i)*b#(i)
 next j
next i
abc#(n)=b#(n)/a#(n,n) ' Получение последнего корня системы линейных уравнений (он не является последним коэффициентом уравнения регрессии!)
' Вычисление остальных корней системы линейных уравнений (в уравнение регрессии в качестве коэффициентов их нужно правильно расставить!)
for i=n-1 to 1 step -1
 s#=b#(i)
 for j=i+1 to n
 s#=s#-abc#(j)*a#(i,j)
 next j
 abc#(i)=s#/a#(i,i)
next i
' Вывод на экран корней системы линейных уравнений
for i=1 to n
 ? "ABC(";i;")=";abc#(i)
next i
' Вывод аргумента, опытного и вычисленного значений функции (обратить внимание, как стоят корни системы в качестве коэффициентов уравнения регрессии!)
' Вычисление и вывод невязки
ss=0
for i=1 to m
 ? x(i),y(i),abc#(1)+abc#(3)*x(i)+abc#(2)*sqr(x(i))
 ss=ss+(abc#(1)+abc#(3)*x(i)+abc#(2)*sqr(x(i))-y(i))^2
next i
? "SS=";ss
' Контрольный цикл для вычисления по заданным значениям аргумента значений функции регрессии
' Цикл аварийно прекращается при задании в качестве аргумента нулевого значения
'do
' input xx : ? abc#(1)+abc#(3)*(xx-100)+abc#(2)*sqr(xx-100)
'loop until (xx=0)
end

B результате прогона программы на экран выводятся результаты:
- суммы для составления системы линейных уравнений
300 836 37,4869 22000 2522,7246 5738,7314 47400
- матрица линейной системы
6 37,4869 300 2522,7246 5738,7314
37,4869 300 2522,7246 5738,7314
300 2522,7246 22000 47400
- корни системы линейных уравнений
a=100,2217085333389
b=0,850902321114453
c=-0,5495501250384637
- значения преобразованного аргумента (x-100), опытного (y) и вычисленного (y(x)) значений функции регрессии
0 100 100,2217
20 116 114,7821
40 130 130,7821
60 146 147,0191
80 164 163,3786
100 180 179,8164
- вычисленное значение невязки (то есть суммы квадратов отклонений точек от линии регрессии
SS=3,602535247802734

P.S. Прошу обратить внимание на отличия значений коэффициентов линии регрессии и суммы квадратов отклонений (невязка), которые получены у меня: делал дома по памяти и подставил 116 вместо 114 и 164 вместо 163...
Правильные значения коэффициентов и суммарного квадрата отклонений привёл Pyotr.
Последний раз редактировалось Developer 30 ноя 2019, 09:51, всего редактировалось 1 раз.
Причина: test


Вернуться в «Другие разделы математики»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 6 гостей