生成一些二维平面上的点:(xi, yi), i=1, …, n,这些数据具有一定的线性趋势。为了得到一条直线y = ax+b,在最小二乘意义下,编程求解a和b,不能使用matlab自动拟合的函数,例如polyfit等
时间: 2024-01-24 22:17:11 浏览: 22
在最小二乘意义下,我们需要找到一条直线 y = ax + b,使得所有数据点到这条直线的距离平方和最小。假设我们有 n 个数据点,分别为 (x1, y1), (x2, y2), ..., (xn, yn),则每个数据点到直线的距离为:
di = |yi - axi - b|
我们的目标是最小化所有距离的平方和:
min Σ(di^2) = min Σ(yi - axi - b)^2
对 a 和 b 分别求偏导数,令其等于 0,可以得到以下两个方程组:
Σ(xi^2)a + Σxi b = Σ(xi yi)
Σxi a + nb = Σyi
其中,n 表示数据点的个数。
根据这两个方程组,我们可以求解出 a 和 b,从而得到最优的直线。
以下是 Python 的代码实现:
```python
import random
# 生成 n 个带有线性趋势的二维点
def generate_data(n):
data = []
for i in range(n):
x = random.uniform(0, 100)
y = 2 * x + random.uniform(-10, 10)
data.append((x, y))
return data
# 求解最小二乘直线的参数 a 和 b
def solve(data):
n = len(data)
s_x = s_y = s_xx = s_xy = 0
for x, y in data:
s_x += x
s_y += y
s_xx += x * x
s_xy += x * y
a = (n * s_xy - s_x * s_y) / (n * s_xx - s_x * s_x)
b = (s_y - a * s_x) / n
return a, b
data = generate_data(100)
a, b = solve(data)
print("最小二乘直线的参数:a = %f, b = %f" % (a, b))
```
运行上述代码,即可得到最小二乘直线的参数。