直线最小二乘拟合的Python代码

21 投票
4 回答
60747 浏览
提问于 2025-04-17 21:14

我有一个散点图,里面有X和Y坐标。我想用最小二乘法来找到一条最佳拟合直线。

最小二乘法拟合直线的意思是:如果(x_1,y_1),....(x_n,y_n)是测量得到的数据对,那么最佳的直线可以表示为y = A + Bx。

这是我用Python写的代码:

 # number of points is 50
 A = (sum(x**2)*sum(y) - sum(x)*sum(x*y)) / (50*sum(x**2) - (sum(x))**2)
 B = (50*sum(x*y) - sum(x)*sum(y)) / (50*sum(x**2) - (sum(x))**2)
 print (A,B)

这样写对吗?我在打印A和B的时候遇到了一些问题。谢谢!

4 个回答

0

你想要把两个列表 xy 进行相乘(或者把它自己相乘),但在Python中这是不被允许的。你要么需要自己写一个函数来实现列表中每个元素的相乘,要么可以使用 numpy.multiply 这个工具。如果你想要对 xy 中的每个元素进行相乘,

import numpy as np
xy = np.multiply(x,y)
1

一个简单的解决方案,只用numpy的话,可以这样做:

import numpy as np

slope, intercept = np.polyfit(X, Y, deg=1)
43

如果你只想画一条简单的直线,可以使用 scipy.stats.linregress 这个工具:

from scipy import stats
slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)

查看文档的链接

20

如果我理解你的问题没错的话,你有两个数据集 xy,你想对它们进行最小二乘拟合。

你不需要自己写算法,scipy.optimize 里的 curve_fit 就可以满足你的需求,试试这个:

from scipy.optimize import curve_fit

def f(x, A, B): # this is your 'straight line' y=f(x)
    return A*x + B

popt, pcov = curve_fit(f, x, y) # your data x, y to fit

在这里,popt[0]popt[1] 分别代表直线的斜率和截距。

想了解更多细节和示例,可以查看这个链接: http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html#scipy.optimize.curve_fit

撰写回答