我想使用线性回归模型,但我想使用普通最小二乘法,我认为它是一种线性回归.我使用的软件是SPSS.它只有线性回归,偏最小二乘和2阶最小二乘.我不知道哪一个是普通的最小二乘(OLS).
我对python比较陌生.我的问题如下
我在一个形成二维弧的任意平面上有一组有噪声的数据点(x,y,z).我希望通过这些点得到最佳拟合圆并返回:中心(x,y,z),半径和残差.
如何在python中使用scipy来解决这个问题.我可以使用迭代方法解决这个问题并为其编写完整的代码.但是,有没有办法在python中使用leastsq最适合圆圈?然后找到中心和半径?
谢谢Owais
我发现自己需要对图像中的每个像素进行最小二乘(或类似的基于矩阵的操作).每个像素都有一组与之关联的数字,因此可以将其排列为3D矩阵.
(可以跳过下一位)
通过最小二乘估计快速解释我的意思:
假设我们有一些二次系统,它由Y = Ax ^ 2 + Bx + C建模,我们正在寻找那些A,B,C系数.使用X的几个样本(至少3个)和相应的Y,我们可以通过以下方式估算它们:
X = [x(:).^2 x(:) ones(10,1)];Y = y(:);coeffs = (X'*X)^(-1)*X'*Y;如果您愿意,可以自己尝试:
A = 5; B = 2; C = 1;
x = 1:10;
y = A*x(:).^2 + B*x(:) + C + .25*randn(10,1); % added some noise here
X = [x(:).^2 x(:) ones(10,1)];
Y = y(:);
coeffs = (X'*X)^-1*X'*Y
coeffs =
5.0040
1.9818
0.9241
Run Code Online (Sandbox Code Playgroud)
如果我迷失了你,请继续注意
*MAJOR REWRITE*我已修改为使其接近我所拥有的真正问题,并仍然使其成为最小的工作示例.
问题设置
%// Setup
xdim …Run Code Online (Sandbox Code Playgroud) 我试图在python中执行最小二乘拟合到具有三个变量的已知函数.我能够为随机生成的有错误的数据完成此任务,但我需要适合的实际数据包括一些数据点,这些数据点是值的上限.该函数将通量描述为波长的函数,但在某些情况下,在给定波长下测量的通量不是带有误差的绝对值,而是通量的最大值,实际值低于零到零的值.
是否有某种方法告诉拟合任务某些数据点是上限?另外,我必须为许多数据集执行此操作,并且可能为上限的数据点的数量对于每个数据集是不同的,因此能够自动执行此操作将是有益的但不是必需的.
如果有任何不清楚的地方我会道歉,如果需要,我会尽力更清楚地解释.
我用来拟合我的数据的代码包含在下面.
import numpy as np
from scipy.optimize import leastsq
import math as math
import matplotlib.pyplot as plt
def f_all(x,p):
return np.exp(p[0])/((x**(3+p[1]))*((np.exp(14404.5/((x*1000000)*p[2])))-1))
def residual(p,y,x,error):
err=(y-(f_all(x,p)))/error
return err
p0=[-30,2.0,35.0]
data=np.genfromtxt("./Data_Files/Object_001")
wavelength=data[:,0]
flux=data[:,1]
errors=data[:,2]
p,cov,infodict,mesg,ier=leastsq(residual, p0, args = (flux, wavelength, errors), full_output=True)
print p
Run Code Online (Sandbox Code Playgroud) 我有37个线性方程和36个变量的矩阵方程; A*X = B. 方程没有确切的答案.我想使用Matlab最小二乘法找到误差最小的答案.我是Matlab的新手,所以任何评论都会有所帮助.谢谢
我在Math Stackexchange中问过这个问题,但似乎没有得到足够的关注,所以我在这里问它.https://math.stackexchange.com/questions/1729946/why-do-we-say-svd-can-handle-singular-matrx-when-doing-least-square-comparison?noredirect=1#comment3530971_1729946
我从一些教程中了解到,当解决最小二乘问题时,SVD应该比QR分解更稳定,并且它能够处理奇异矩阵.但是我在matlab中编写的以下示例似乎支持相反的结论.我对SVD没有深刻的理解,所以如果您可以在Math StackExchange的旧帖子中查看我的问题并向我解释,我会非常感激.
我使用具有大条件数(e + 13)的矩阵.结果显示SVD得到比QR(e-27)大得多的误差(0.8)
% we do a linear regression between Y and X
data= [
47.667483331 -122.1070832;
47.667483331001 -122.1070832
];
X = data(:,1);
Y = data(:,2);
X_1 = [ones(length(X),1),X];
%%
%SVD method
[U,D,V] = svd(X_1,'econ');
beta_svd = V*diag(1./diag(D))*U'*Y;
%% QR method(here one can also use "\" operator, which will get the same result as I tested. I just wrote down backward substitution to educate myself)
[Q,R] = qr(X_1)
%now do backward substitution
[nr nc] = …Run Code Online (Sandbox Code Playgroud) matlab svd least-squares qr-decomposition matrix-decomposition
我在使用 Numba 求解 python 中的最小二乘法时遇到问题。这是我的代码:
import numpy as np
from numba import jit
@jit(nopython=True)
def test(A, B):
alpha = np.linalg.lstsq(A,B,rcond=None)
return alpha
A = np.random.rand(10,3)
B = np.random.rand(10,1)
alpha = test(A,B)
print(alpha)
Run Code Online (Sandbox Code Playgroud)
如果没有“@jit(nopython=True)”行,它就可以工作。使用“@jit”时出现以下错误:
Invalid use of Function(<function lstsq at 0x000001767E21E318>) with argument(s) of type(s): (array(float64, 2d, C), array(float64, 2d, C), rcond=none)
* parameterized
In definition 0:
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Invalid use of ExternalFunction(numba_ez_gelsd) with argument(s) of type(s): (Literal[int](100), int64, int64, int64, ArrayCTypes(dtype=float64, ndim=2), int64, …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种非常有效的方法来计算n个列表中的所有可能组合,然后保持组合与最小的最小二乘差异.
我已经有了一个代码可以做到这一点,但是当它达到数百万个组合时,事情变得缓慢.
candidates_len包含长度列表,即[[500,490,510,600] [300,490,520] [305,497,515]] candidate_name包含名称列表的列表,即[['a',' b','c','d'] ['mi','mu','ma'] ['pi','pu','pa']]
两个列表都有n个列表.
# Creating the possible combinations and store the lists of lengths in vector r
r=[[]]
for x in candidates_len:
r = [ i + [y] for y in x for i in r ]
#Storing the names of the combinations and store the lists of identifiers in vector z
z=[[]]
for x in candidates_name:
z = [ i + [y] for y in x for i …Run Code Online (Sandbox Code Playgroud) 在stackoverflow.com/q/38378118中询问了此问题,但没有令人满意的答案。
LASSO与?= 0等效于普通的最小二乘,但是R glmnet()和lm()R中似乎不是这种情况。为什么?
library(glmnet)
options(scipen = 999)
X = model.matrix(mpg ~ 0 + ., data = mtcars)
y = as.matrix(mtcars["mpg"])
coef(glmnet(X, y, lambda = 0))
lm(y ~ X)
Run Code Online (Sandbox Code Playgroud)
它们的回归系数最多相符2个有效数字,这可能是由于其优化算法的终止条件略有不同:
glmnet lm
(Intercept) 12.19850081 12.30337
cyl -0.09882217 -0.11144
disp 0.01307841 0.01334
hp -0.02142912 -0.02148
drat 0.79812453 0.78711
wt -3.68926778 -3.71530
qsec 0.81769993 0.82104
vs 0.32109677 0.31776
am 2.51824708 2.52023
gear 0.66755681 0.65541
carb -0.21040602 -0.19942
Run Code Online (Sandbox Code Playgroud)
当添加交互项时,差异会更糟。
X = model.matrix(mpg ~ 0 + . + . …Run Code Online (Sandbox Code Playgroud) 我创建了两个散点图,然后使用lsline为每个图添加回归线。我使用以下代码:
for i=1:2
x = ..;
y = ..;
scatter(x, y, 50, 'MarkerFaceColor',myColours(i, :));
end
h_lines = lsline;
Run Code Online (Sandbox Code Playgroud)
但是,较深的线远远超出了该散点图中的最后一个数据点(大约在x = 0.3处):
lsline似乎没有允许设置其水平范围的属性。在Matlab 2016a中,是否有一种解决方法可分别为这两行设置此设置?
least-squares ×10
matlab ×4
python ×4
math ×2
regression ×2
combinations ×1
dictionary ×1
geometry ×1
glmnet ×1
lm ×1
matrix ×1
numba ×1
optimization ×1
performance ×1
r ×1
scipy ×1
spss ×1
statistics ×1
svd ×1