Python和科学计算认证群组  - 讨论区

标题:请教 linear fit 问题

2011年10月27日 星期四 15:55

如何利用 singular value decomposition,进行线性拟合?
即所谓的 multiple linear regression approach employing singular value decomposition, 这个与我们平时常有的 Linear Fit (如 stats.linregress(x,y) 或者 polyfit(x,y,1))有什么区别? 可否用python编写个例子演示下?

2011年10月27日 星期四 19:20

multiple linear regression 不一定需要 SVD吧。你能说说为什么要用SVD做MLR吗。

你可以试试numpy.linalg.lstsq

2011年10月27日 星期四 21:28

我从科研文献上看到利用SVD进行线形拟合的精度要高于常有的 Linear Fit ,比如有2个具有线性关系的信号:参考信号(信噪比很高)和探测信号,主要体现在当探测信号的信噪比较低的时候,利用SVD拟合的结果精度比较高。

即 SVD is used to minimize the least-squares residuals, to estimate the fit coefficients by minimizing the X^2 function:  

X^2 = Sum[探测信号-拟合信号]^2,  i=1...N(信号通道数)

2011年10月28日 星期五 06:28

找到一篇介绍:

http://folk.uio.no/inf9540/

  Linear Regression Models

看了一下公式,似乎不是太困难。你可以自己先试试看。我有时间也试试。

http://scikit-learn.sourceforge.net/stable/ 这个是Python的机器学习库,里面虽然没有SVD,但有一些别的方法,解决的问题是一样的。

2011年10月28日 星期五 15:03

我找了个SVD的2-D算法例子,看了不是很懂,请版主稍加研究下,怎么利用它进行1-D线性。

http://cing.googlecode.com/svn-history/r497/trunk/cing/python/cing/Libs/svd.py

感谢先!!!

2011年10月28日 星期五 16:27

没有这么麻烦吧。根据上面的Linear Regression Models中的公式:

lambda_ = 1

u,s,v = np.linalg.svd(x, full_matrices=0)

omega = s**2/(s**2 + lambda_)

beta = np.sum(omega * np.dot(u.T, y)/s * v.T, axis=-1)

当lambda_ = 0时,beta就是 x * beta  = y 的最小二乘解。lambda_ 是一个调节的参数。它不为0时,就是SVD的MLR解了。 

2011年10月28日 星期五 20:01

下面是一个完整的例子:

import numpy as np

 

x = np.array([[0,0],[0,0.001],[1.0,1.0],[2.0,2.0]])

y = np.array([0,0.1,1,2.1])

 

print np.linalg.lstsq(x, y)

 

lambda_ = 1

u,s,v = np.linalg.svd(x, full_matrices=0)

omega = s**2/(s**2 + lambda_)

 

print np.sum(omega*np.dot(u.T, y)/s * v.T, axis=-1)

 

输入变量为x,输出为y,为了演示效果,特意添加了一个错误数据:(0,0.001) -> 0.1

程序比较lstsq()和SVD法的结果:

lstsq : -98.96, 100

SVD : 0.47268203  0.47278156

可以看出SVD受错误信息的影响较小。

 

2011年10月30日 星期日 13:44

那个例子有2个自变量

x = np.array([[0,0],[0,0.001],[1.0,1.0],[2.0,2.0]])

y = np.array([0,0.1,1,2.1])

 

0*a + 0*b = 0

0*a +0.001*b = 0.1

a + b = 1

2*a + 2*b = 2.1

lambda_ 为0时,svd就是最小二乘解,不为0时,做出一些取舍,因此不是最小二乘解,但是有更大的容错性。并不是说lambda_ 不为0的结果就一定比lstsq好。

2011年11月02日 星期三 23:32

请问版主 x中2个自变量中的第二个自变量究竟代表什么意思呢?

比如基于SVD的线性拟合,这个第二个自变量就是代表要估计的误差还是?

2011年11月03日 星期四 07:07

multiple linear regression 就是多自变量的线性拟合,两个自变量的拟合就是要找到一个三维空间中的平面和已知的数据最接近。

你可以想象某个实验中有两个输入值和一个观测值,想知道输入值和观测值之间的线性关系。

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号