Простая многомерная подгонка кривой
У меня есть куча данных, как правило, в форме
a, b, c,..., y
где y = f (a, b, c...)
Большинство из них представляют собой три и четыре переменные и имеют записи 10k - 10M. Мое общее предположение состоит в том, что они являются алгебраическими по своей природе, что-то вроде:
y = P1 a ^ E1 + P2 b ^ E2 + P3 c ^ E3
К сожалению, мой последний класс статистического анализа был 20 лет назад. Каков самый простой способ получить хорошее приближение f? Инструменты с открытым исходным кодом с очень минимальной кривой обучения (т.е. Что-то, где я мог бы получить приличное приближение через час или около того), было бы идеальным. Спасибо!
Ответы
Ответ 1
В случае, если это полезно, используйте шаблон Numpy/Scipy (Python), чтобы сделать то, что вы хотите:
from numpy import array
from scipy.optimize import leastsq
def __residual(params, y, a, b, c):
p0, e0, p1, e1, p2, e2 = params
return p0 * a ** e0 + p1 * b ** e1 + p2 * c ** e2 - y
# load a, b, c
# guess initial values for p0, e0, p1, e1, p2, e2
p_opt = leastsq(__residual, array([p0, e0, p1, e1, p2, e2]), args=(y, a, b, c))
print 'y = %f a^%f + %f b^%f %f c^%f' % map(float, p_opt)
Если вы действительно хотите понять, что происходит, вам придется потратить время на масштабирование кривой обучения для какого-то инструмента или среды программирования - я действительно не думаю, что это возможно. Люди обычно не пишут специализированные инструменты для того, чтобы делать что-то вроде трехрежимных регрессий власти.
Ответ 2
Там есть инструмент для установки 1D и 2D кривых на zunzun.com, но я не думаю, что это выходит за рамки двух переменных. Аналогично, Matlab не поддерживает более двух измерений (насколько я знаю), и это, безусловно, не бесплатно.
В противном случае вы сможете найти часть своего решения в Numericical Recipes.
Но, как указывали другие плакаты, вам, вероятно, понадобится хотя бы базовая идея вашей функциональной модели (которая, мы надеемся, линейна или может быть линеаризована, и в этом случае у вас будет гораздо больше решений на вашем удаление)
Ответ 3
Основы привязки данных включают в себя принятие общей формы решения, угадывание некоторых начальных значений для констант, а затем итерацию, чтобы минимизировать ошибку угаданного решения, чтобы найти конкретное решение, обычно в смысле наименьших квадратов.
Посмотрите R или Octave для инструментов с открытым исходным кодом. Они оба способны к анализу с наименьшими квадратами, а несколько обучающих программ просто ищут Google.
Изменить: Октавный код для оценки коэффициентов для многочлена 2-го порядка
x = 0:0.1:10;
y = 5.*x.^2 + 4.*x + 3;
% Add noise to y data
y = y + randn(size(y))*0.1;
% Estimate coefficients of polynomial
p = polyfit(x,y,2)
На моей машине я получаю:
ans =
5.0886 3.9050 2.9577
Ответ 4
Знаете ли вы, какую силу вы хотите ограничить своим полиномом?
Если нет предела, то вы всегда можете получить точное соответствие для N точек, сопоставив его с полиномом с N коэффициентами. Для этого вы вставляете N разных точек в свое уравнение, получая N уравнений и N неизвестных (коэффициенты), которые затем вы можете использовать либо простую алгебру средней школы, либо матрицу для решения неизвестных.
Ответ 5
Если у вас есть предположение в форме f, [*] вам нужен минимизатор, чтобы найти оптимальные параметры. Инструменты Scottie T предлагают работать, как ROOT, и многие другие.
Если у вас нет подсказки, какая форма f может вас принять, вы действительно в глубокой беде.
[*] То есть вы знаете, что
f = f (x, y, z, w,...; p1, p2, p3...)
где p
- параметры, а координаты x
, y
...
Ответ 6
Короткий ответ: это не так просто. Рассмотрим непараметрический подход к подмножествам данных.
Есть два основных вопроса, которые вам необходимо решить (1). Вы действительно заботитесь о параметрах функции, т.е. о своих P1, E1,... или вам будет хорошо, просто оценивая среднюю функцию (2 ) действительно ли вам нужно оценить функцию по всем данным?
В первую очередь я остановлюсь на том, что указанная вами функция нелинейна (в параметрах для оценки), поэтому обычные наименьшие квадраты не будут работать. Предположим, что вы указали линейную функцию. У вас все еще будет проблема с значениями 10M. Линейная регрессия может быть выполнена эффективным образом с использованием QR-факторизации, но вам все еще остается алгоритм O (p * n ^ 2), где p - количество параметров, которые вы пытаетесь оценить. Если вы хотите оценить нелинейную среднюю функцию, она становится намного хуже.
Единственный способ, которым вы сможете оценить что-либо в таком большом наборе данных, - это использование подмножества для выполнения оценки. В принципе, вы произвольно выбираете подмножество и используете это для оценки функции.
Если вы не заботитесь о своих значениях параметров и просто хотите оценить среднюю функцию, вам, вероятно, будет лучше использовать метод непараметрической оценки.
Надеюсь, это поможет.
Лейф