-
Notifications
You must be signed in to change notification settings - Fork 0
/
logistic-regression.c
62 lines (51 loc) · 1.43 KB
/
logistic-regression.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <math.h>
double sigmoid(double z) {
return 1.0 / (1.0 + exp(-z));
}
double predict(double x[], double theta[], int n) {
double z = 0.0;
for (int i = 0; i < n; i++) {
z += x[i] * theta[i];
}
return sigmoid(z);
}
void train(double X[][2], double y[], double theta[], int m, int n, double alpha, int iterations) {
for (int iter = 0; iter < iterations; iter++) {
double gradient[n];
for (int j = 0; j < n; j++) {
gradient[j] = 0.0;
for (int i = 0; i < m; i++) {
double prediction = predict(X[i], theta, n);
gradient[j] += (prediction - y[i]) * X[i][j];
}
gradient[j] /= m;
}
for (int j = 0; j < n; j++) {
theta[j] -= alpha * gradient[j];
}
}
}
int main() {
double X[4][2] = {
{1.0, 0.0},
{1.0, 1.0},
{1.0, 2.0},
{1.0, 3.0}
};
double y[4] = {0, 0, 1, 1};
int m = 4;
int n = 2;
double theta[2] = {0.0, 0.0};
double alpha = 0.1;
int iterations = 1000;
train(X, y, theta, m, n, alpha, iterations);
printf("Learned parameters: \n");
for (int i = 0; i < n; i++) {
printf("theta[%d] = %f\n", i, theta[i]);
}
double test[2] = {1.0, 1.5};
double prob = predict(test, theta, n);
printf("Predicted probability for x1 = 1.5: %f\n", prob);
return 0;
}