Files
yola/zaoYun/master/clf/clf_svm_linear_nit.c
coco 85d885e008 a
2026-07-03 16:29:47 +08:00

168 lines
4.4 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define N_FEATURES 6
#define N_CLASSES 2
#define N_VECTORS 5
#define N_ROWS 2
#define N_COEFFICIENTS 1
#define N_INTERCEPTS 1
#define KERNEL_TYPE 'l'
#define KERNEL_GAMMA 0.02
#define KERNEL_COEF 0.0
#define KERNEL_DEGREE 3
double vectors[5][6] = {{8.0, 40.0, 163.0, 157.0, 133.0, 134.0}, {17.0, 21.0, 238.0, 233.0, 128.0, 134.0}, {151.0, 5.0, 148.0, 154.0, 130.0, 126.0}, {150.0, 20.0, 141.0, 141.0, 132.0, 128.0}, {1.0, 29.0, 200.0, 190.0, 135.0, 131.0}};
double coefficients[1][5] = {{-0.040830728202884616, -0.022381636307857937, -0.025203496279882144, 0.029904217315242083, 0.05851164347538264}};
double intercepts[1] = {26.353487165292364};
int weights[2] = {3, 2};
int predict (double features[]) {
int i, j, k, d, l;
double kernels[N_VECTORS];
double kernel;
switch (KERNEL_TYPE) {
case 'l':
// <x,x'>
for (i = 0; i < N_VECTORS; i++) {
kernel = 0.;
for (j = 0; j < N_FEATURES; j++) {
kernel += vectors[i][j] * features[j];
}
kernels[i] = kernel;
}
break;
case 'p':
// (y<x,x'>+r)^d
for (i = 0; i < N_VECTORS; i++) {
kernel = 0.;
for (j = 0; j < N_FEATURES; j++) {
kernel += vectors[i][j] * features[j];
}
kernels[i] = pow((KERNEL_GAMMA * kernel) + KERNEL_COEF, KERNEL_DEGREE);
}
break;
case 'r':
// exp(-y|x-x'|^2)
for (i = 0; i < N_VECTORS; i++) {
kernel = 0.;
for (j = 0; j < N_FEATURES; j++) {
kernel += pow(vectors[i][j] - features[j], 2);
}
kernels[i] = exp(-KERNEL_GAMMA * kernel);
}
break;
case 's':
// tanh(y<x,x'>+r)
for (i = 0; i < N_VECTORS; i++) {
kernel = 0.;
for (j = 0; j < N_FEATURES; j++) {
kernel += vectors[i][j] * features[j];
}
kernels[i] = tanh((KERNEL_GAMMA * kernel) + KERNEL_COEF);
}
break;
}
int starts[N_ROWS];
int start;
for (i = 0; i < N_ROWS; i++) {
if (i != 0) {
start = 0;
for (j = 0; j < i; j++) {
start += weights[j];
}
starts[i] = start;
} else {
starts[0] = 0;
}
}
int ends[N_ROWS];
for (i = 0; i < N_ROWS; i++) {
ends[i] = weights[i] + starts[i];
}
if (N_CLASSES == 2) {
for (i = 0; i < N_VECTORS; i++) {
kernels[i] = -kernels[i];
}
double decision = 0.;
for (k = starts[1]; k < ends[1]; k++) {
decision += kernels[k] * coefficients[0][k];
}
for (k = starts[0]; k < ends[0]; k++) {
decision += kernels[k] * coefficients[0][k];
}
decision += intercepts[0];
if (decision > 0) {
return 0;
}
return 1;
}
double decisions[N_INTERCEPTS];
double tmp;
for (i = 0, d = 0, l = N_ROWS; i < l; i++) {
for (j = i + 1; j < l; j++) {
tmp = 0.;
for (k = starts[j]; k < ends[j]; k++) {
tmp += kernels[k] * coefficients[i][k];
}
for (k = starts[i]; k < ends[i]; k++) {
tmp += kernels[k] * coefficients[j - 1][k];
}
decisions[d] = tmp + intercepts[d];
d = d + 1;
}
}
int votes[N_INTERCEPTS];
for (i = 0, d = 0, l = N_ROWS; i < l; i++) {
for (j = i + 1; j < l; j++) {
votes[d] = decisions[d] > 0 ? i : j;
d = d + 1;
}
}
int amounts[N_CLASSES];
for (i = 0, l = N_CLASSES; i < l; i++) {
amounts[i] = 0;
}
for (i = 0; i < N_INTERCEPTS; i++) {
amounts[votes[i]] += 1;
}
int classVal = -1;
int classIdx = -1;
for (i = 0; i < N_CLASSES; i++) {
if (amounts[i] > classVal) {
classVal = amounts[i];
classIdx= i;
}
}
return classIdx;
}
int main(int argc, const char * argv[]) {
/* Features: */
double features[argc-1];
int i;
for (i = 1; i < argc; i++) {
features[i-1] = atof(argv[i]);
}
/* Prediction: */
printf("%d", predict(features));
return 0;
}