Scipy.optimization приближение линейной функции

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

Например, если у меня есть образец вывода после zip() функции для x и y

[(1,1),(4,2),(6,4),(8,6),(10,11)]

Как видите, нелинейная функция приближается намного лучше, но мне нужна линейная функция для моих целей.

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


person im_infamous    schedule 19.07.2014    source источник


Ответы (2)


В дополнение к np.polyfit и scipy.stats.linregress, предложенным @ user2589273, низкоуровневым способом выполнения линейной регрессии является поиск матрицы коэффициентов с использованием np.linalg.lstsq. Хотя этот подход требует немного больше усилий, чем использование одной из предварительно упакованных функций для выполнения линейной регрессии, очень полезно понять, как это работает на базовом уровне, в частности, когда вы начинаете работать с многомерными данными.

Например:

import numpy as np

# a simple linear relationship: y = mx + c with m=0.5 and c=2
x = np.arange(50)
y = x * 0.5 + 2
y += np.random.randn(50) * 5    # add some noise

# we can rewrite the line equation as y = Ap, where A=[[x, 1]] and p=[[m], [c]]
A = np.c_[x, np.ones(50)]

# solving for p gives us the slope and intercept
p, residuals, rank, svals = np.linalg.lstsq(A, y)

График соответствия:

from matplotlib import pyplot as plt

fig, ax = plt.subplots(1, 1)
ax.hold(True)
ax.plot(x, y, 'ob', label='data')
ax.plot(x, A.dot(p), '-k', lw=2, label='linear fit')
ax.legend()

введите описание изображения здесь

person ali_m    schedule 20.07.2014
comment
Спасибо за ответ. Не понял, как определить наклон a (для формы ax+b) из матрицы A (если я получил его соответствие из документов). Или numpy справится с этим за меня? - person im_infamous; 21.07.2014
comment
в этом случае p будет массивом размера (2,), содержащим [gradient, intercept] - person ali_m; 06.10.2014

Вы пробовали что-то, что подходит для метода наименьших квадратов? http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html Также, если я правильно помню, у polyfit numpy была возможность определять степени свободы подгонки, которая вам нужна, где в вашем случае это будет одна.

importing polyfit from numpy... etc.

coefficients = polyfit( xlist, ylist, 1 ) #where 1 is the degree of freedom
p = poly1d( coefficients ) 
x = linspace( 0, 5, 100 ) #generates 100 points between 0 and 5 to plot 'curve'
plot( x, p(x), label='Best Fit Line' ) 

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

person user2589273    schedule 19.07.2014
comment
Я посмотрю и вернусь с результатом - person im_infamous; 19.07.2014