#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;
}
C语言多元线性回归算法实现 - 优化版

原文地址: https://www.cveoy.top/t/topic/nMpU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录