#include "stdafx.h"
#include "SVM_SMO.h"
SMO::SMO(void): //创建构造函数对程序进行初始化
N(0),
d(400),
C(100.0f),
tolerance(0.001f),
two_sigma_squared(10.0f),
is_test_only(true),
first_test_i(0),
end_support_i(-1),
eps(0.001f)
{
data_file_name="svm.data";
svm_file_name="svm.model";
output_file_name="svm.output";
output_see_alph="alph.data";
}
SMO::~SMO(void) //创建析构函数
{
}
float SMO::learned_func_nonlinear(int k) //学习方程 f(x)=alph*Y*k(x,x)-b, 是从i到N
{
float sum=0;
for(int i=0;i<end_support_i;i++)
{
if(alph[i]>0)
sum+=alph[i]*target[i]*kernel_func(i,k);
}
sum-=b;
return sum;
}
float SMO::kernel_func(int i,int k) //对核函数进行计算,本程序选择的核函数为径向基核函数
{
float sum=dot_product_func(i,k);
sum*=-2;
sum+=self_dot_product[i]+self_dot_product[k];
return exp(-sum/two_sigma_squared);
}
float SMO::dot_product_func(int i,int k) //此函数实现向量之间的点乘运算。其中i,k,为索引
{
float dot=0;
for(int j=0;j<d;j++)
dot+=dense_points[i][j]*dense_points[k][j];
return dot;
}
void SMO::precomputed_self_dot_product()
{
self_dot_product.resize(N);
for(int i=0;i<N;i++)
self_dot_product[i]=dot_product_func(i,i);
}
int SMO::read_data(istream& is) //此函数读取和保存数据到内存中
{
string s;
int n_lines;
for(n_lines=0;getline(is,s,'\n');n_lines++)
{
- 1
- 2
- 3
前往页