Простая подгонка многомерной кривой - PullRequest
18 голосов
/ 09 февраля 2009

У меня есть куча данных, как правило, в виде а, б, в, ..., у

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

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

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

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

Ответы [ 6 ]

12 голосов
/ 09 февраля 2009

Если это полезно, вот шаблон 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)

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

3 голосов
/ 09 февраля 2009

Существует инструмент для подгонки 1D и 2D кривых на zunzun.com , но я не думаю, что он выходит за рамки двух переменных. Аналогично, Matlab не поддерживает подгонку более двух измерений (насколько я знаю) и, конечно, она не бесплатна.

В противном случае вы можете найти часть своего решения в Числовых рецептах .

Но, как указывали другие авторы, вам, вероятно, понадобится, по крайней мере, базовое представление о вашей функциональной модели (которая, мы надеемся, является линейной или может быть линеаризована, и в этом случае у вас будет гораздо больший набор решений на вашем сайте). удаление)

2 голосов
/ 09 февраля 2009

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

Посмотрите R или Октава для инструментов с открытым исходным кодом. Они оба способны анализировать методом наименьших квадратов, а несколько учебных пособий - всего лишь поиск в 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
1 голос
/ 09 февраля 2009

Знаете ли вы, какой силой вы хотите ограничить свой полином?

Если нет предела, то вы всегда можете получить точное совпадение для N точек, сопоставив его с полиномом, имеющим N коэффициентов. Чтобы сделать это, вы включаете в свое уравнение N различных точек, получая N уравнений и N неизвестных (коэффициентов), которые затем вы можете использовать либо в простой алгебре средней школы, либо в матрице для поиска неизвестных.

0 голосов
/ 16 февраля 2009

Краткий ответ: это не так просто. Рассмотрим непараметрический подход к подмножествам данных.

Есть 2 основных вопроса, о которых вам нужно решить: (1) действительно ли вы заботитесь о параметрах функции, например, о ваших P1, E1, ..., или вам будет достаточно просто оценить среднюю функцию (2 ) вам действительно нужно оценить функцию по всем данным?

Первое, что я упомяну, это то, что указанная вами функция нелинейна (в оцениваемых параметрах), поэтому обычные наименьшие квадраты не будут работать. Давайте представим, что вы указали линейную функцию. У вас все еще будет проблема со значениями 10M. Линейная регрессия может быть эффективно выполнена с использованием QR-факторизации, но у вас все еще остается алгоритм O (p * n ^ 2), где p - количество параметров, которые вы пытаетесь оценить. Если вы хотите оценить нелинейную среднюю функцию, она станет намного хуже.

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

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

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

Leif

0 голосов
/ 09 февраля 2009

Если у вас есть предположение в виде f, [*] вам нужен минимизатор, чтобы найти оптимальные параметры. Инструменты, предложенные Скотти Т, будут работать, как и ROOT и многие другие.

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


[*] То есть вы знаете, что

f = f (x, y, z, w, ...; p1, p2, p3 ...)

, где p s - параметры, а координаты - x, y ...

...