试用加权线性回归拟合区间(0,4π)的正弦函数
时间: 2024-11-06 12:23:27 浏览: 23
在Python中,我们可以使用加权线性回归(Weighted Linear Regression)来拟合某个区间内的数据点,尤其是当这些数据点的重要性不是均匀分布时。对于正弦函数y = sin(x),我们知道它是周期性的,在区间(0, 4π)上,我们可以选择适当的数据点并赋予它们权重,以便更好地捕捉到函数的波动。
首先,你需要确定权重的策略。一种常见的做法是根据正弦函数的变化率或数据点距离原点的距离来分配权重。如果你有一个理论模型或者对权重有具体的想法,那就可以直接使用;如果没有,我们可以简单地基于距离或者频率分配权重。
以下是一个简单的步骤指南:
1. **准备数据**:生成一系列x值,比如等间距的`np.linspace(0, 4*np.pi, num=100)`,计算对应的sin(x)值。
2. **定义权重**:例如,你可以为靠近拐点处的x值分配较大的权重,可以用平方根或指数衰减的形式。
```python
import numpy as np
from scipy.optimize import curve_fit
# 定义正弦函数
def sine_func(x):
return np.sin(x)
# 创建数据
x = np.linspace(0, 4*np.pi, num=100)
y = sine_func(x)
```
3. **设置权重**:
```python
# 假设权重基于x值远离原点的程度
weights = 1 / x**2 # 这里只是一个示例,可以根据实际情况调整
```
4. **执行加权线性回归**:
使用`curve_fit`函数,传入正弦函数、数据和权重:
```python
def weighted_curve_fit(func, x, y, weights):
popt, _ = curve_fit(func, x, y, p0=[1], sigma=1/weights, absolute_sigma=True)
return popt
params, _ = weighted_curve_fit(sine_func, x, y, weights)
```
5. **评估结果**:
现在你得到了拟合参数,可以检查是否满意拟合效果。如果需要,你可以绘制原始数据、拟合曲线以及残差图进行可视化。
```python
import matplotlib.pyplot as plt
# 绘制原始数据
plt.scatter(x, y, label='Data', s=weights)
plt.plot(x, sine_func(x, *params), 'r-', label='Fit')
plt.legend()
plt.show()
```
阅读全文