C语言多元线性回归算法实现 - 优化版
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// 定义常量
const int MAX_ITER = 10000;
const double EPS = 1e-6;
// 定义样本结构体
typedef struct {
double *features;
double label;
} Sample;
// 读取数据函数
int read_data(const char *excel_file, Sample *samples, int *n, int *m) {
// TODO: 实现从 Excel 文件中读取数据,并存储到 samples 中
// n: 样本数量
// m: 特征数量
return 0;
}
// 计算预测值函数
double h(const double *x, const double *w, int m) {
double sum = 0;
for (int i = 0; i < m; i++) {
sum += x[i] * w[i];
}
sum += w[m];
return sum;
}
// 计算损失函数
double loss(const Sample *samples, const double *w, int n, int m) {
double sum = 0;
for (int i = 0; i < n; i++) {
double y_hat = h(samples[i].features, w, m);
double diff = y_hat - samples[i].label;
sum += diff * diff;
}
return sum / (2.0 * n);
}
// 更新参数函数
void update_w(Sample *samples, double *w, int n, int m, double learning_rate) {
double grad[m + 1] = {0};
for (int i = 0; i < n; i++) {
double y_hat = h(samples[i].features, w, m);
for (int j = 0; j < m; j++) {
grad[j] += (y_hat - samples[i].label) * samples[i].features[j];
}
grad[m] += (y_hat - samples[i].label);
}
for (int j = 0; j < m + 1; j++) {
w[j] -= learning_rate * grad[j];
}
}
// 多元线性回归函数
void linear_regression(Sample *samples, double *w, int n, int m, int max_iter, double learning_rate) {
for (int iter = 0; iter < max_iter; iter++) {
double old_loss = loss(samples, w, n, m);
update_w(samples, w, n, m, learning_rate);
double new_loss = loss(samples, w, n, m);
if (fabs(old_loss - new_loss) < EPS) {
break;
}
}
}
int main() {
char excel_file[] = "C:\\Users\\17731\\Desktop\\附件2:气象数据.xlsx";
int n, m;
Sample *samples;
double *w;
// 读取数据
n = read_data(excel_file, samples, &n, &m);
// 分配内存
samples = malloc(n * sizeof(Sample));
w = malloc((m + 1) * sizeof(double));
// 初始化参数
for (int i = 0; i < m + 1; i++) {
w[i] = 0;
}
// 训练模型
linear_regression(samples, w, n, m, MAX_ITER, 0.01);
// 打印参数
for (int i = 0; i < m + 1; i++) {
printf("%f ", w[i]);
}
printf("\n");
// 释放内存
free(samples);
free(w);
return 0;
}
原文地址: https://www.cveoy.top/t/topic/nMpU 著作权归作者所有。请勿转载和采集!