Подтвердить что ты не робот

Простая многомерная подгонка кривой

У меня есть куча данных, как правило, в форме a, b, c,..., y

где y = f (a, b, c...)

Большинство из них представляют собой три и четыре переменные и имеют записи 10k - 10M. Мое общее предположение состоит в том, что они являются алгебраическими по своей природе, что-то вроде:

y = P1 a ^ E1 + P2 b ^ E2 + P3 c ^ E3

К сожалению, мой последний класс статистического анализа был 20 лет назад. Каков самый простой способ получить хорошее приближение f? Инструменты с открытым исходным кодом с очень минимальной кривой обучения (т.е. Что-то, где я мог бы получить приличное приближение через час или около того), было бы идеальным. Спасибо!

4b9b3361

Ответ 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 - количество параметров, которые вы пытаетесь оценить. Если вы хотите оценить нелинейную среднюю функцию, она становится намного хуже.

Единственный способ, которым вы сможете оценить что-либо в таком большом наборе данных, - это использование подмножества для выполнения оценки. В принципе, вы произвольно выбираете подмножество и используете это для оценки функции.

Если вы не заботитесь о своих значениях параметров и просто хотите оценить среднюю функцию, вам, вероятно, будет лучше использовать метод непараметрической оценки.

Надеюсь, это поможет.

Лейф