能否提供一个用C语言实现逻辑回归的具体实例代码?
时间: 2024-10-21 07:08:33 浏览: 32
当然可以。逻辑回归是一种广泛用于分类任务的简单线性模型。在C语言中,由于没有内置支持复杂数学运算和优化库,我们通常会使用一些数学库,比如GNU Scientific Library (GSL) 来实现。这里是一个简单的逻辑回归求解二分类问题的示例代码:
```c
#include <stdio.h>
#include <gsl/gsl_math.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_matrix.h>
#define LEARN_RATE 0.01
#define MAX_ITERATIONS 1000
typedef struct {
double *weights; // 权重向量
int num_features;
} LogisticRegression;
void sigmoid(double z) {
return 1.0 / (1 + gsl_exp(-z));
}
double predict(const LogisticRegression* model, const double* features) {
double dot_product = 0.0;
for (int i = 0; i < model->num_features; i++) {
dot_product += model->weights[i] * features[i];
}
return sigmoid(dot_product);
}
void train(LogisticRegression* model, const double** data, const int* labels, int num_samples, int num_features) {
model->num_features = num_features;
model->weights = gsl_vector_alloc(num_features);
for (int iter = 0; iter < MAX_ITERATIONS; iter++) {
double cost = 0.0;
for (int i = 0; i < num_samples; i++) {
double y_pred = predict(model, data[i]);
double delta_w = labels[i] - y_pred * LEARN_RATE;
cost += -labels[i] * log(y_pred) - (1 - labels[i]) * log(1 - y_pred);
for (int j = 0; j < num_features; j++) {
model->weights[j] += delta_w * data[i][j];
}
}
if (cost == 0 || abs(cost - prev_cost) < 1e-5) { // 平稳状态判断
break;
}
prev_cost = cost;
}
}
// 示例数据和标签处理
int main() {
int num_samples = 5;
double **data = (double **)malloc(sizeof(double*) * num_samples);
const int* labels = ... // 根据实际数据填充正负样本
// 数据初始化
LogisticRegression model;
train(&model, data, labels, num_samples, num_features);
// 使用模型预测新数据
for (int i = 0; i < num_samples; i++) {
printf("Sample %d prediction: %.2f\n", i, predict(&model, data[i]));
}
gsl_vector_free(model.weights); // 清理内存
free(data);
return 0;
}
```
请注意,这只是一个基础示例,并未包含数据预处理、特征缩放以及交叉验证等实践中的重要步骤。此外,为了简化,这个例子假设输入数据已经被预处理成合适的形式。
阅读全文