[SciPy-User] multidimensional polynomial fit
josef.pktd at gmail.com
josef.pktd at gmail.com
Sat Jun 12 15:44:30 EDT 2010
On Sat, Jun 12, 2010 at 3:43 PM, <josef.pktd at gmail.com> wrote:
> On Sat, Jun 12, 2010 at 2:36 PM, Oscar Gerardo Lazo Arjona
> <algebraicamente at gmail.com> wrote:
>> Hello!
>>
>> Is there some way to get a polynomial fit to a set of n-tuples? I've got
>> a set of 4-tuples: (x1,x2,x3,T), and i would like to get a polynomial
>> T(x1,x2,x3).
>>
>> I've seen numpy.polyfit, but that doesn't work for multidimensional sets.
>>
>> If there is no method available, I would be willing to write the
>> necessary code, just tell me how to get it included.
>
> Assuming I understand correctly, fitting the last variable to a
> polynomial of the first three
>
> depends on how many cross terms you want.
>
> here is an example which restricts the powers in the cross-terms
>
>
>>>> x = np.arange(5)[:,None]+ [0,10,100]
>>>> x = x[:,::-1] #reverse for ndindex
>>>> x
> array([[100, 10, 0],
> [101, 11, 1],
> [102, 12, 2],
> [103, 13, 3],
> [104, 14, 4]])
>>>> simplex = [ind for ind in np.ndindex(*[3]*x.shape[1]) if sum(ind)<=2]
>>>> simplex
> [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 2, 0), (1,
> 0, 0), (1, 0, 1), (1, 1, 0), (2, 0, 0)]
>>>> np.array([np.prod(x**ind,1) for ind in simplex]).T
> array([[ 1, 0, 0, 10, 0, 100, 100, 0, 1000,
> 10000],
> [ 1, 1, 1, 11, 11, 121, 101, 101, 1111,
> 10201],
> [ 1, 2, 4, 12, 24, 144, 102, 204, 1224,
> 10404],
> [ 1, 3, 9, 13, 39, 169, 103, 309, 1339,
> 10609],
> [ 1, 4, 16, 14, 56, 196, 104, 416, 1456,
> 10816]])
>
>
>
>
>>>> nobs = 100
>>>> x0 = np.random.randn(nobs,3)
>>>> x = np.array([np.prod(x0**ind,1) for ind in simplex]).T
>>>> y = x.sum(1) + 0.1*np.random.randn(nobs)
>>>> y.shape
> (100,)
>>>> from scikits.statsmodels import OLS
>>>> res = OLS(y, x).fit()
>>>> res.params
> array([ 1.02381284, 1.00619277, 0.99437357, 0.96839791, 1.00923175,
> 1.00342817, 0.99046168, 1.00125689, 0.99069758, 0.98808115])
>>>> yest = res.model.predict(x)
>>>> import matplotlib.pyplot as plt
>>>> plt.plot(y, yest)
correction for scatter plot:
plt.plot(y, yest, 'o')
>
>
> use of OLS can be replaced by np.linalg.lstsq
>
> Josef
>
>
>>
>> thanks!
>>
>> Oscar
>> _______________________________________________
>> SciPy-User mailing list
>> SciPy-User at scipy.org
>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>
>
More information about the SciPy-User
mailing list