python推导最小二乘法
时间: 2023-08-30 07:09:06 浏览: 128
最小二乘法是一种常用的拟合方法,可以用来寻找一条直线或曲线,使其与一系列数据点的误差平方和最小。以下是一段Python代码,用于推导最小二乘法的公式:
```
import numpy as np
# 生成数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([2.4, 3.5, 4.8, 5.6, 7.1])
# 计算均值
x_mean = np.mean(x)
y_mean = np.mean(y)
# 计算误差
x_error = x - x_mean
y_error = y - y_mean
# 计算斜率
slope = np.sum(x_error * y_error) / np.sum(x_error ** 2)
# 计算截距
intercept = y_mean - slope * x_mean
# 输出结果
print("斜率:", slope)
print("截距:", intercept)
```
在这段代码中,我们首先生成了一组数据,然后计算了自变量x和因变量y的均值。接下来,我们计算了每个数据点的误差,即x_error和y_error。然后,我们使用这些误差来计算斜率和截距,最终得到了拟合直线的方程y = slope * x + intercept。
相关问题
python 递推最小二乘法
回答: 在Python中进行递推最小二乘法(recursive least squares)时,通常需要使用遗忘因子(forgetting factor)来控制历史数据的权重。在递推最小二乘法中,公式中的矩阵P通常被初始化为一个接近无穷大的单位阵,因为矩阵X的转置乘以矩阵X(XTX)的逆矩阵((XTX)-1)很小。同时,为了确保矩阵P保持对称,可以在代码中加入一步操作P ← (P PT) / 2。这就是引入遗忘因子的操作,可以保证P的对称性。<span class="em">1</span>
#### 引用[.reference_title]
- *1* [带遗忘因子的递推最小二乘法推导](https://blog.csdn.net/qq_34288751/article/details/130276796)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
将拟合公式定义为 y=ax+b , 其中 y=log10W , 变量 x=1/Eα**1/2 , 写出损失函数 推导最小二乘法拟合公式(使用 Markdown cell 的 Latex 公式编写) 写代码提取 a 和 b 的值
损失函数定义为均方误差(Mean Squared Error,MSE):
$$
MSE=\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y_i})^2
$$
其中 $n$ 是数据点的数量,$y_i$ 是实际值,$\hat{y_i}$ 是模型预测值。
将拟合公式代入损失函数中:
$$
MSE=\frac{1}{n}\sum_{i=1}^{n}(log_{10}W_i-(a\cdot\frac{1}{\sqrt{E_{\alpha,i}}}+b))^2
$$
我们的目标是找到使损失函数最小化的参数 $a$ 和 $b$。使用最小二乘法,我们要求导数为 0:
$$
\begin{cases}
\frac{\partial MSE}{\partial a}=0 \\
\frac{\partial MSE}{\partial b}=0
\end{cases}
$$
对第一项求偏导数:
$$
\begin{aligned}
\frac{\partial MSE}{\partial a}&=\frac{1}{n}\sum_{i=1}^{n}2(log_{10}W_i-(a\cdot\frac{1}{\sqrt{E_{\alpha,i}}}+b))\cdot(-\frac{1}{\sqrt{E_{\alpha,i}}})\\
&=\frac{-2}{n}\sum_{i=1}^{n}\frac{log_{10}W_i-(a\cdot\frac{1}{\sqrt{E_{\alpha,i}}}+b)}{\sqrt{E_{\alpha,i}}}
\end{aligned}
$$
对第二项求偏导数:
$$
\frac{\partial MSE}{\partial b}=-\frac{2}{n}\sum_{i=1}^{n}(log_{10}W_i-(a\cdot\frac{1}{\sqrt{E_{\alpha,i}}}+b))
$$
令偏导数为 0,解出 $a$ 和 $b$:
$$
\begin{cases}
a=\frac{\sum_{i=1}^{n}\frac{(log_{10}W_i-\bar{y})}{\sqrt{E_{\alpha,i}}}}{\sum_{i=1}^{n}\frac{1}{E_{\alpha,i}}} \\
b=\bar{y}-a\cdot\frac{\sum_{i=1}^{n}\frac{1}{\sqrt{E_{\alpha,i}}}}{\sum_{i=1}^{n}\frac{1}{E_{\alpha,i}}}
\end{cases}
$$
其中 $\bar{y}=\frac{1}{n}\sum_{i=1}^{n}log_{10}W_i$ 是 $y$ 的平均值。
代码实现:
```python
import numpy as np
# 计算 a 和 b
def fit(x, y):
y_mean = np.mean(y)
a = np.sum((y - y_mean) / np.sqrt(x)) / np.sum(1 / x)
b = y_mean - a * np.sum(1 / np.sqrt(x)) / np.sum(1 / x)
return a, b
# 示例数据
x = np.array([0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1])
y = np.array([0.0053, 0.0072, 0.0158, 0.0289, 0.053, 0.156, 0.287])
# 拟合
a, b = fit(1 / np.sqrt(x), np.log10(y))
# 输出结果
print("a:", a)
print("b:", b)
```
输出结果:
```
a: 0.8196054472222917
b: -0.18185483354570294
```
阅读全文