使用梯度下降算法和最小二乘法,用正弦函数拟合曲线的完整c++代码
时间: 2024-10-20 14:04:48 浏览: 35
遗传算法与最小二乘法拟合函数比较的C/C++代码实现
5星 · 资源好评率100%
在C++中,我们可以使用梯度下降算法和最小二乘法来拟合正弦函数。这里是一个简化的示例,假设我们有一个数据集,并尝试找到最佳参数a和b来近似给定数据点。请注意,这个例子没有包含全部的错误检查和异常处理,它主要用于演示基本原理。
```cpp
#include <iostream>
#include <vector>
#include <cmath>
// 模拟正弦函数
double sine_function(double x, double a, double b) {
return a * std::sin(b * x);
}
// 计算损失函数(残差平方和)
double loss(const std::vector<double>& data_x, const std::vector<double>& data_y, double a, double b) {
double sum = 0.0;
for (size_t i = 0; i < data_x.size(); ++i) {
sum += pow(data_y[i] - sine_function(data_x[i], a, b), 2);
}
return sum / data_x.size();
}
// 梯度下降优化
void gradient_descent(std::vector<double>& data_x, std::vector<double>& data_y, double& a, double& b, double learning_rate, int num_iterations) {
for (int i = 0; i < num_iterations; ++i) {
// 求导
double da = -2.0 * sum((data_y - sine_function(data_x, a, b)) * data_x, data_x.size());
double db = -2.0 * sum((data_y - sine_function(data_x, a, b)) * std::cos(b * data_x), data_x.size());
// 更新参数
a -= learning_rate * da;
b -= learning_rate * db;
// 每隔一些迭代打印当前参数和损失
if (i % 10 == 0) {
std::cout << "Iteration " << i+1 << ": a=" << a << ", b=" << b << ", Loss=" << loss(data_x, data_y, a, b) << std::endl;
}
}
}
// 主函数
int main() {
// 假设我们有数据
std::vector<double> data_x = {0, 0.5, 1, 1.5, 2};
std::vector<double> data_y = {0, 0.707, 1, 0.707, 0}; // 正弦函数取值
double a = 1, b = 1; // 初始参数
double learning_rate = 0.01;
int num_iterations = 1000;
gradient_descent(data_x, data_y, a, b, learning_rate, num_iterations);
// 输出拟合后的正弦函数
for (size_t i = 0; i < data_x.size(); ++i) {
std::cout << "x=" << data_x[i] << ", Predicted y=" << sine_function(data_x[i], a, b) << std::endl;
}
return 0;
}
```
阅读全文