c++,使用梯度下降算法和最小二乘法,用正弦函数拟合曲线
时间: 2024-10-20 19:04:32 浏览: 23
遗传算法与最小二乘法拟合函数比较的C/C++代码实现
5星 · 资源好评率100%
在C++中,使用梯度下降算法和最小二乘法来拟合正弦函数通常需要一些数学库的支持,例如Eigen等矩阵运算库。以下是一个简化的例子,展示了如何用这些工具进行操作:
首先,假设我们有一个包含时间(x)和对应的测量值(y)的数据集合。我们将用`Eigen`库来表示矩阵,并用`std::vector`来存储数据点。
```cpp
#include <iostream>
#include <Eigen/Dense>
// 假设我们有数据结构
struct DataPoint {
double x;
double y;
};
// 定义正弦函数
double sine_function(double x, double A, double w, double phi, double b) {
return A * std::sin(x * w + phi) + b;
}
// 梯度下降函数
void gradient_descent(DataPoint* data, int n_data, Eigen::VectorXd& params, double learning_rate, int max_iterations) {
// 初始化参数向量
Eigen::VectorXd initial_params(5);
// ... 初始化参数值
for (int iter = 0; iter < max_iterations; ++iter) {
// 计算当前参数下的总误差
Eigen::VectorXd error = data->y - evaluate_sine_function(data, params);
// 计算梯度
Eigen::VectorXd gradient = (2/n_data) * data->weights.transpose() * error;
// 更新参数
params -= learning_rate * gradient;
}
}
// 函数拟合
void fit_with_gradient_descent(std::vector<DataPoint>& data, double learning_rate, int max_iterations) {
// 将数据转换成Eigen矩阵
Eigen::MatrixXd X(n_data, 6); // 假设我们的函数有5个参数加上常数项
for (int i = 0; i < n_data; ++i) {
X.row(i) << 1, data[i].x, data[i].x * data[i].x, data[i].x * data[i].x * data[i].x, data[i].x * data[i].x * data[i].x * data[i].x, 1;
}
// 调用梯度下降
gradient_descent(&data[0], data.size(), X.rightCols<5>(), learning_rate, max_iterations);
}
```
在这个例子中,我们首先将数据点转化为特征向量,然后创建了一个特征矩阵X,包含了x的所有幂次。接着,我们在每次迭代中计算误差向量,再通过矩阵乘法得到梯度,最后更新参数。
阅读全文