Сембей Норимаки хорошо объяснил ваш основной вопрос, поэтому я рассмотрю ваш второстепенный вопрос = является ли полифит правильной функцией?
Линия наилучшего соответствия определяется как линия со средней ошибкой, равной нулю.
Если это должна быть «линия», мы могли бы использовать полифит, который будет соответствовать многочлену. Конечно, «прямая» может быть определена как полином первой степени, но полиномы первой степени обладают некоторыми свойствами, облегчающими работу с ними. Полиномиальное (или линейное) уравнение первого порядка, которое вы ищете, должно иметь следующую форму:
y = mx + b
где y — ваша зависимая переменная, а X — ваша независимая переменная. Итак, задача такова: найти такие m и b, чтобы смоделированный y был как можно ближе к фактическому y. Как оказалось, ошибка, связанная с линейной подгонкой, является выпуклой, то есть имеет одно минимальное значение. Чтобы вычислить это минимальное значение, проще всего объединить векторы смещения и x следующим образом:
Xcombined = [x.' ones(length(x),1)];
затем использовал нормальное уравнение, полученное из минимизации ошибки
beta = inv(Xcombined.'*Xcombined)*(Xcombined.')*(y.')
отлично, теперь наша линия определяется как Y = Xcombined*beta. чтобы нарисовать линию, просто возьмите образец из некоторого диапазона x и добавьте член b
Xplot = [[0:.1:5].' ones(length([0:.1:5].'),1)];
Yplot = Xplot*beta;
plot(Xplot, Yplot);
Так почему же полифит так плохо работает? ну, я не могу сказать наверняка, но моя гипотеза состоит в том, что вам нужно поменять местами ваши матрицы x и y. Я предполагаю, что это дало бы вам гораздо более разумную линию.
x = x.';
y = y.';
тогда попробуй
p = polyfit(x,y,n)
Надеюсь, это поможет. Один мудрый человек однажды сказал мне (и я узнаю это каждый день): не доверяй алгоритму, которого не понимаешь!
person
David Kaftan
schedule
01.03.2017