📄 winsvmdlg.cpp
字号:
{
MessageBox("嘻嘻,训练还没结束呢!");
return;
}
}
m_yuce=new Cyuce;
if(m_yuce->DoModal()==IDOK)
{
// char* line;
// int max_line_len = 1024;
max_nr_attr = 64;
char input0[1024],output0[1024],model0[1024];
FILE *input, *output;
strcpy(input0, m_yuce->m_input);
strcpy(model0, m_yuce->m_model);
strcpy(output0, m_yuce->m_output);
predict_probability = m_yuce->predict_probability;
input = fopen(input0,"r");//预测数据文件
if(input == NULL)
{
//fprintf(stderr,"can't open input file %s\n",argv[i]);
//exit(1);
CString strs;
strs.Format("不能打开文件 %s\n",input0);
MessageBox(strs);
return;
}
output = fopen(output0,"w");//预测结果文件保存地址
if(output == NULL)
{
//fprintf(stderr,"can't open output file %s\n",argv[i+2]);
//exit(1);
CString strs;
strs.Format("不能保存文件 %s\n",output0);
MessageBox(strs);
return;
}
if((trainmodel=svm_load_model(model0))==0)//模型文件地址选择
{
//fprintf(stderr,"can't open model file %s\n",argv[i+1]);
//exit(1);
//CString strs;//不需要了 因为svm_load_model(model0))里面有消息弹出,更说明问题
//strs.Format("不能打开文件 %s\n",model0);
//MessageBox(strs);
return;
}
// line = (char *) malloc(max_line_len*sizeof(char));
x = (struct svm_node *) malloc(max_nr_attr*sizeof(struct svm_node));
if(predict_probability)
if(svm_check_probability_model(trainmodel)==0)
{
//fprintf(stderr,"Model does not support probabiliy estimates\n");
//exit(1);
MessageBox("训练好的model文件不支持概率预报");
return;
}
predict(input,output);
svm_destroy_model(trainmodel);
// free(line);
free(x);
fclose(input);
fclose(output);
delete m_yuce;
m_yuce=NULL;
return;
};
delete m_yuce;
m_yuce=NULL;
}
void CwinsvmDlg::predict(FILE *input, FILE *output)
{
int correct = 0;
int total = 0;
double error = 0;
double sumv = 0, sumy = 0, sumvv = 0, sumyy = 0, sumvy = 0;
// CTime ts1 = CTime::GetCurrentTime();
int svm_type=svm_get_svm_type(trainmodel);
int nr_class=svm_get_nr_class(trainmodel);
int *labels=(int *) malloc(nr_class*sizeof(int));
double *prob_estimates=NULL;
int j;
CString str;//添加
if(predict_probability)
{
if (svm_type==NU_SVR || svm_type==EPSILON_SVR)
{
//printf("Prob. model for test data: target value = predicted value + z,\nz: Laplace distribution e^(-|z|/sigma)/(2sigma),sigma=%g\n",svm_get_svr_probability(model));
str.Format("测试数据的样本: 目标值 = 预测值 + z,\nz: 拉普拉斯分布 e^(-|z|/sigma)/(2sigma),sigma=%g\n",svm_get_svr_probability(trainmodel));
info+=str;
}
else
{
svm_get_labels(trainmodel,labels);
prob_estimates = (double *) malloc(nr_class*sizeof(double));
fprintf(output,"labels");
for(j=0;j<nr_class;j++)
fprintf(output," %d",labels[j]);
fprintf(output,"\n");
}
}
while(1)
{
int i = 0;
int c;
double target,v;
if (fscanf(input,"%lf",&target)==EOF)
break;
while(1)
{
if(i>=max_nr_attr-1) // need one more for index = -1
{
max_nr_attr *= 2;
x = (struct svm_node *) realloc(x,max_nr_attr*sizeof(struct svm_node));
}
do {
c = getc(input);
if(c=='\n' || c==EOF) goto out2;
} while(isspace(c));
ungetc(c,input);
if (fscanf(input,"%d:%lf",&x[i].index,&x[i].value) < 2)
{
//fprintf(stderr,"Wrong input format at line %d\n", total+1);
//exit(1);
CString strs;
strs.Format("错误的输入格式在 %d行\n",total+1);
MessageBox(strs);info.Empty();
return;
}
++i;
}
out2:
x[i++].index = -1;
if (predict_probability && (svm_type==C_SVC || svm_type==NU_SVC))
{
v = svm_predict_probability(trainmodel,x,prob_estimates);
fprintf(output,"%g ",v);
for(j=0;j<nr_class;j++)
fprintf(output,"%g ",prob_estimates[j]);
fprintf(output,"\n");
}
else
{
v = svm_predict(trainmodel,x);
fprintf(output,"%g\n",v);
}
if(v == target)
++correct;
error += (v-target)*(v-target);
sumv += v;
sumy += target;
sumvv += v*v;
sumyy += target*target;
sumvy += v*target;
++total;
}
//printf("Accuracy = %g%% (%d/%d) (classification)\n",
// (double)correct/total*100,correct,total);
//printf("Mean squared error = %g (regression)\n",error/total);
//printf("Squared correlation coefficient = %g (regression)\n",
// ((total*sumvy-sumv*sumy)*(total*sumvy-sumv*sumy))/
// ((total*sumvv-sumv*sumv)*(total*sumyy-sumy*sumy))
// );
if (svm_type==NU_SVR || svm_type==EPSILON_SVR)
{
str.Format("方差 = %g \n",error/total);
info+=str;
str.Format("平方相关系数(相似性) = %g \n",
((total*sumvy-sumv*sumy)*(total*sumvy-sumv*sumy))/
((total*sumvv-sumv*sumv)*(total*sumyy-sumy*sumy))
);
info+=str+"\n";
}
else
{
str.Format("精确度 = %g%% (%d/%d)\n",
(double)correct/total*100,correct,total);
info+=str;
}
// CTimeSpan ts = CTime::GetCurrentTime()-ts1;
//str.Format("预测时间为%d日%d小时%d分钟%d秒",ts.GetDays(),ts.GetHours() ,ts.GetMinutes(),ts.GetSeconds());
// info+=str;
if(predict_probability)
{
free(prob_estimates);
free(labels);
}
MessageBox(info);
info.Empty();
}
void CwinsvmDlg::OnBnClickedButton3()
{
if (m_guyihua==NULL)
{
m_guyihua=new Cguyihua;
m_guyihua->Create(IDD_DIALOG3,this);
m_guyihua->ShowWindow(1);
}
else
{
delete m_guyihua;
m_guyihua=NULL;
}
//if(m_guyihua->DoModal()==IDOK)
//{
// //MessageBox(info);
// delete m_guyihua;
// m_guyihua=NULL;
//}
//delete m_guyihua;
//m_guyihua=NULL;
}
//遗传求参数
void CwinsvmDlg::yichuan(int i,int a,int aend,double b,double bend,double bstep,double c,double cend,double cstep)
{
//int j=aend-a;//度的步数
int k=(bend-b)/bstep;//coef0步数
int l=(cend-c)/cstep;//C步数
double zy;//预测效率
int m=0;//递归参数
//临时变量
int degreetemp(0);
double coef0temp(0);
double Ctemp(0);
for( int ii=a;ii<aend;ii++)
{
param.degree=ii;
for( double jj=b;jj<bend;jj+=bstep)
{
param.coef0=jj;
for( double kk=c;kk<cend;kk+=cstep)
{
param.C=kk;
info.Empty();//放这里增加运算
zy = do_cross_validationy();
if( zy > (limit+limitstep) )
{
m++;
limit=zy;
degreetemp=param.degree;
coef0temp=param.coef0;
Ctemp=param.C;
infoy=info;
info.Format("度是 %d,coef0是 %f, 惩罚因子C是 %f\n",degreetemp,coef0temp,Ctemp);
infoy+=info;
}
}
}
}
if(m)
{
limitstep=limitstep/3;
a=degreetemp;aend=degreetemp+1;
b=coef0temp-bstep+4*bstep/(k+4),bend=coef0temp+bstep-4*bstep/(k+4),bstep=4*bstep/(k+4);//可以为负数//步宽先改变//步数减半-2处理,再改变步长
c=Ctemp-cstep+4*cstep/(l+4);
if(c<=0)
c=0.00000001,cend=Ctemp+cstep-2*cstep/(l+2),cstep=2*cstep/(l+2);
else
cend=Ctemp+cstep-4*cstep/(l+4),cstep=4*cstep/(l+4);
yichuan(++i,a,aend, b, bend, bstep, c, cend, cstep);
i--;
}
if(i==0)
{ yichuanend();
}
}
void CwinsvmDlg::yichuan(int i,double a,double aend,double astep)
{
int l=(aend-a)/astep;//C步数
double zy;//预测效率
int m=0;//递归参数
//临时变量
double Ctemp(0);
for(double ii=a;ii<aend;ii+=astep)
{
param.C=ii;
info.Empty();
zy = do_cross_validationy();
if( zy > (limit+limitstep) )
{
m++;
limit=zy;
Ctemp=param.C;
infoy=info;
info.Format("惩罚因子C是 %f\n",Ctemp);
infoy+=info;
}
}
if(m)
{
limitstep=limitstep/3;
a=Ctemp-astep+4*astep/(l+4);
if(a<=0)
a=0.00000001,aend=Ctemp+astep-2*astep/(l+2),astep=2*astep/(l+2);
else
aend=Ctemp+astep-4*astep/(l+4),astep=4*astep/(l+4);
yichuan(++i,a,aend,astep);
i--;
}
if(i==0)
{ yichuanend();
}
}
void CwinsvmDlg::yichuan(int i,double b,double bend,double bstep,double c,double cend,double cstep)
{
int k=(bend-b)/bstep;//coef0步数
int l=(cend-c)/cstep;//C步数
double zy;//预测效率
int m=0;//递归参数
//临时变量
double coef0temp(0);
double Ctemp(0);
for(double ii=b ;ii<bend;ii+=bstep)
{
param.coef0=ii;
for(double jj=c ;jj<cend;jj+=cstep)
{
param.C=jj;
info.Empty();
zy = do_cross_validationy();
if( zy > (limit+limitstep) )
{
m++;
limit=zy;
coef0temp=param.coef0;
Ctemp=param.C;
infoy=info;
info.Format("coef0是 %f, 惩罚因子C是 %f\n",coef0temp,Ctemp);
infoy+=info;
}
}
}
if(m)
{
limitstep=limitstep/3;
b=coef0temp-bstep+4*bstep/(k+4),bend=coef0temp+bstep-4*bstep/(k+4),bstep=4*bstep/(k+4);//可以为负数
c=Ctemp-cstep+4*cstep/(l+4);
if(c<=0)
c=0.00000001,cend=Ctemp+cstep-2*cstep/(l+2),cstep=2*cstep/(l+2);
else
cend=Ctemp+cstep-4*cstep/(l+4),cstep=4*cstep/(l+4);
yichuan(++i, b, bend, bstep, c, cend, cstep);
i--;
}
if(i==0)
{ yichuanend();
}
}
void CwinsvmDlg::yichuan1(int i,int a,int aend,double b,double bend,double bstep,double c,double cend,double cstep)
{
//int j=aend-a;//度的步数
int k=(bend-b)/bstep;//coef0步数
int l=(cend-c)/cstep;//nu步数
double zy;//预测效率
int m=0;//递归参数
//临时变量
int degreetemp(0);
double coef0temp(0);
double nutemp(0);
for( double kk=c;kk<cend;kk+=cstep)
{
param.nu=kk;
for(int ii=a ;ii<aend;ii++)
{
param.degree=ii;
for(double jj=b ;jj<bend;jj+=bstep)
{
param.coef0=jj;
info.Empty();
zy = do_cross_validationy();
if( zy > (limit+limitstep) )
{
m++;
limit=zy;
degreetemp=param.degree;
coef0temp=param.coef0;
nutemp=param.nu;
infoy=info;
info.Format("度是 %d,coef0是 %f, 参数v(nu)是 %f\n",degreetemp,coef0temp,nutemp);
infoy+=info;
}
}
}
}
if(m)
{
limitstep=limitstep/3;
a=degreetemp;aend=degreetemp+1;
b=coef0temp-bstep+4*bstep/(k+4),bend=coef0temp+bstep-4*bstep/(k+4),bstep=4*bstep/(k+4);//可以为负数
c=nutemp-cstep+4*cstep/(l+4);
if(c<=0)
c=0.00000001,cend=nutemp+cstep-2*cstep/(l+2),cstep=2*cstep/(l+2);
else
{
cend=nutemp+cstep-4*cstep/(l+4),cstep=4*cstep/(l+4);
if(cend>1)
cend=1;
}
yichuan1(++i, a,aend, b, bend, bstep, c, cend, cstep);
i--;
}
if(i==0)
{
yichuanend();
}
}
void CwinsvmDlg::yichuan1(int i,double c,double cend,double cstep)
{
int l=(cend-c)/cstep;//nu步数
double zy;//预测效率
int m=0;//递归参数
//临时变量
double nutemp(0);
for( double ii=c;ii<cend;ii+=cstep)
{
param.nu=ii;
info.Empty();
zy = do_cross_validationy();
if( zy > (limit+limitstep) )
{
m++;
limit=zy;
nutemp=param.nu;
infoy=info;
info.Format("参数v(nu)是 %f\n",nutemp);
infoy+=info;
}
}
if(m)
{
limitstep=limitstep/3;
c=nutemp-cstep+4*cstep/(l+4);
if(c<=0)
c=0.00000001,cend=nutemp+cstep-2*cstep/(l+2),cstep=2*cstep/(l+2);
else
{
cend=nutemp+cstep-4*cstep/(l+4),cstep=4*cstep/(l+4);
if(cend>1)
cend=1;
}
yichuan1(++i, c, cend, cstep);
i--;
}
if(i==0)
{
yichuanend();
}
}
void CwinsvmDlg::yichuan1(int i,double b,double bend,double bstep,double c,double cend,double cstep)
{
//int j=aend-a;//度的步数
int k=(bend-b)/bstep;//coef0步数
int l=(cend-c)/cstep;//nu步数
double zy;//预测效率
int m=0;//递归参数
//临时变量
double coef0temp(0);
double nutemp(0);
for( double jj=c;jj<cend;jj+=cstep)
{
param.nu=jj;
for(double ii=b ;ii<bend;ii+=bstep)
{
param.coef0=ii;
info.Empty();
zy = do_cross_validationy();
if( zy > (limit+limitstep) )
{
m++;
limit=zy;
coef0temp=param.coef0;
nutemp=param.nu;
infoy=info;
info.Format("coef0是 %f, 参数v(nu)是 %f\n",coef0temp,nutemp);
infoy+=info;
}
}
}
if(m)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -