纯代码实现:
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<ostream>
using namespace std;
///////////////////////////////////线性
//parameter list
#define tol 0.001
#define tolJ 0.00001
#define maxcirl 50
#define max 10000
#define dem 2
#define C 0.6
#define file_drec "E:/vs_workplace/SVM/testSet.txt"
#define result_dec "E:/vs_workplace/SVM/result_alpha_b_5.txt"
#define result_classify "E:/vs_workplace/SVM/result_classify_5.txt"
#define ifKernel 1
#define d 0.2
struct elemeter
{
double Error[max][2];
double alpha[max];
double b;
double X[max][dem];
double Y[max];
int length;
int x_dem;
}Elemter;
double getE(int i);
void UpdataEk(int k)
{
double Ek = getE(k);
Elemter.Error[k][0] = 1;
Elemter.Error[k][1] = Ek;
}
double dot_product(int length,double x1[],double x2[])
{
double result = 0;
if(!ifKernel)
{
for(int i = 0;i<length;i++)
result += x1[i]*x2[i];
}
else
{
for(int i = 0;i<length;i++)
result += (x1[i] - x2[i]) * (x1[i] - x2[i]);
result = exp(-result / (2 * d * d));
}
return result;
}
double getE(int i)
{
int length = Elemter.length;
int x_dem = Elemter.x_dem;
double re = 0;
for(int k = 0;k<length;k++)
{
re += Elemter.Y[k] * Elemter.alpha[k] * dot_product(x_dem,Elemter.X[i],Elemter.X[k]);
}
re = re + Elemter.b - Elemter.Y[i];
return re;
}
void SelectJ(int *j,double *Ej,int i,double Ei)
{
Elemter.Error[i][0] = 1;
Elemter.Error[i][1] = Ei;
double maxE = 0;
int length = Elemter.length;
int flag = 0;
for(int k = 0;k<length;k++)
{
if(Elemter.Error[k][0] == 1 && Elemter.Error[k][1] != 0)
{
if(k == i)
continue;
double Ek = getE(k)