📄 xuanxiang.cpp
字号:
// xuanxiang.cpp : 实现文件
//
#include "stdafx.h"
#include "winsvm.h"
#include "xuanxiang.h"
#include ".\xuanxiang.h"
// Cxuanxiang 对话框
//extern CwinsvmDlg * pApp;
extern int Maxiter;
IMPLEMENT_DYNAMIC(Cxuanxiang, CDialog)
Cxuanxiang::Cxuanxiang(CWnd* pParent /*=NULL*/)
: CDialog(Cxuanxiang::IDD, pParent)
, m_kdegree(0)
, m_ky(0)
, m_kr(0)
, m_cache(0)
, m_eps(0)
, m_cset(0)
, m_weight(0)
, m_nu(0)
, m_plost(0)
, m_nfold(0)
, m_filename(_T(""))
, m_filename1(_T(""))
, m_kdegreeend(10)
, m_krend(1)
, m_krstep(0.5)
, m_nuend(1)
, m_nustep(0.1)
, m_plostend(1)
, m_ploststep(0.1)
, m_csetend(1001)
, m_csetstep(100)
, limit(0.7)
, limitstep(0)
, m_weightclass(0)
{
}
Cxuanxiang::~Cxuanxiang()
{
}
void Cxuanxiang::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST2, m_weightlist);
DDX_Control(pDX, IDC_COMBO1, m_svmty);
DDX_Control(pDX, IDC_COMBO2, m_kty);
DDX_Text(pDX, IDC_EDIT1, m_kdegree);
DDX_Text(pDX, IDC_EDIT2, m_ky);
DDX_Text(pDX, IDC_EDIT3, m_kr);
DDX_Text(pDX, IDC_EDIT4, m_cache);
DDX_Text(pDX, IDC_EDIT5, m_eps);
DDX_Text(pDX, IDC_EDIT6, m_cset);
DDX_Text(pDX, IDC_EDIT7, m_weight);
DDX_Text(pDX, IDC_EDIT8, m_nu);
DDX_Text(pDX, IDC_EDIT9, m_plost);
DDX_Text(pDX, IDC_EDIT10, m_nfold);
DDX_Text(pDX, IDC_EDIT11, m_filename);
DDX_Text(pDX, IDC_EDIT12, m_filename1);
DDX_Text(pDX, IDC_EDIT19, m_kdegreeend);
DDX_Text(pDX, IDC_EDIT21, m_krend);
DDX_Text(pDX, IDC_EDIT22, m_krstep);
DDX_Text(pDX, IDC_EDIT23, m_nuend);
DDX_Text(pDX, IDC_EDIT24, m_nustep);
DDX_Text(pDX, IDC_EDIT25, m_plostend);
DDX_Text(pDX, IDC_EDIT26, m_ploststep);
DDX_Text(pDX, IDC_EDIT27, m_csetend);
DDX_Text(pDX, IDC_EDIT28, m_csetstep);
//DDX_Text(pDX, IDC_EDIT13, m_yichuanfile);
DDX_Text(pDX, IDC_EDIT29, limit);
DDX_Text(pDX, IDC_EDIT30, limitstep);
DDV_MinMaxDouble(pDX, limit, 0, 1);
DDV_MinMaxDouble(pDX, limitstep, 0, 1);
DDX_Text(pDX, IDC_EDIT14, m_weightclass);
}
BEGIN_MESSAGE_MAP(Cxuanxiang, CDialog)
ON_BN_CLICKED(IDOK, OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON4, OnBnClickedButton4)
// ON_CBN_EDITCHANGE(IDC_COMBO1, OnCbnEditchangeCombo1)
ON_CBN_SELCHANGE(IDC_COMBO1, OnCbnSelchangeCombo1)
ON_CBN_SELCHANGE(IDC_COMBO2, OnCbnSelchangeCombo2)
ON_BN_CLICKED(IDC_CHECK14, OnBnClickedCheck14)
// ON_BN_CLICKED(IDC_BUTTON6, OnBnClickedButton6)
END_MESSAGE_MAP()
// Cxuanxiang 消息处理程序
void Cxuanxiang::OnBnClickedOk()
{
if(parse_command_line()==0)
return;
if(MessageBox(xuanxiang,"确定所选择的选型么? ",MB_YESNO)==IDNO)
{
return;
}
OnOK();
}
int Cxuanxiang::parse_command_line()
{
// parse options
UpdateData();
xuanxiang.Empty();
CString str;
if(m_svmty.GetCurSel() != 0 &&
m_svmty.GetCurSel() != 1 &&
m_svmty.GetCurSel() != 2 &&
m_svmty.GetCurSel() != 3 &&
m_svmty.GetCurSel() != 4 )
{
MessageBox("svm类型没有选择");
return 0;
}
GetDlgItemText(IDC_COMBO1,str);
param0.svm_type = m_svmty.GetCurSel();//int absd=-s svm类型:SVM设置类型(默认0)
xuanxiang="svm类型是"+str+"\n";
if(m_kty.GetCurSel() != 0 &&
m_kty.GetCurSel() != 1 &&
m_kty.GetCurSel() != 2 &&
m_kty.GetCurSel() != 3 &&
m_kty.GetCurSel() != 4 )
{
MessageBox("核函数没有选择");
return 0;
}
GetDlgItemText(IDC_COMBO2,str);
param0.kernel_type =m_kty.GetCurSel();//=int asdfds=-t 核函数类型:核函数设置类型(默认2)
xuanxiang+="核函数是"+str+"\n";
if(GetDlgItem(IDC_EDIT1)->IsWindowEnabled())
{
if (m_kdegree<=0)
{
MessageBox("多项式核的度不能小于0");
return 0;
}
str.Format("多项式核的度是%d\n",m_kdegree);
xuanxiang+=str;
param0.degree = m_kdegree;//int sdf=核函数中的degree设置(默认3)
}
if(GetDlgItem(IDC_EDIT2)->IsWindowEnabled())
{
str.Format("核函数中的γ是%.4f\n",m_ky);
xuanxiang+=str;
param0.gamma = m_ky;//double γ=:核函数中的γ函数设置(默认1/ k)
}
if(GetDlgItem(IDC_EDIT3)->IsWindowEnabled())
{
str.Format("核函数中的coef0是%.4f\n",m_kr);
xuanxiang+=str;
param0.coef0 = m_kr;//double r= coef0:核函数中的coef0设置(默认0)
}
if(GetDlgItem(IDC_EDIT8)->IsWindowEnabled())
{
if(m_nu<=0 || m_nu>1)
{
MessageBox("ν-SVC,一类SVM和ν- SVR的参数必须在0~1之间");
return 0;
}
str.Format("ν-SVC,一类SVM和ν- SVR的参数是%.4f\n",m_nu);
xuanxiang+=str;
param0.nu = m_nu;//double -n nu:设置ν-SVC,一类SVM和ν- SVR的参数(默认0.5)
}
if(m_cache<=0)
{
MessageBox("缓存要大于0M");
return 0;
}
str.Format("缓存是%.1f\n",m_cache);
xuanxiang+=str;
param0.cache_size = m_cache;//double -m cachesize:设置cache内存大小,以MB为单位(默认40)
if(GetDlgItem(IDC_EDIT6)->IsWindowEnabled())
{
if(m_cset<=0)
{
MessageBox("惩罚因子要大于0");
return 0;
}
str.Format("惩罚因子是%.1f\n",m_cset);
xuanxiang+=str;
param0.C = m_cset;//-c cost:设置C-SVC,ε -SVR和ν-SVR的参数(默认1)惩罚因子,
//越大训练的模型越那个…,当然耗的时间越多
}
if(m_eps<=0)
{
MessageBox("运算的终止判据要大于0");
return 0;
}
str.Format("运算的终止判据是%.4f\n",m_eps);
xuanxiang+=str;
param0.eps = m_eps;//double 设置允许的终止判据(默认0.001)
if(GetDlgItem(IDC_EDIT9)->IsWindowEnabled())
{
if(param0.svm_type==3 && m_plost<=0)
{
MessageBox("ε-SVR 中损失函数ε的值要大于0");
return 0;
}
str.Format("ε-SVR 中损失函数ε的值是%.4f\n",m_plost);
xuanxiang+=str;
param0.p = m_plost;//double -p ε:设置ε -SVR 中损失函数ε的值(默认0.1)
}
//param.shrinking = atoi(argv[i]);int -h shrinking:是否使用启发式,0或1(默认1)指明训练过程是否使用缩减
//param.probability = atoi(argv[i]);int 指明训练过程是否需要预报概率,默认值0
//cross_validation = 1;
//nr_fold = m_nfold;//-v n: n-fold交互检验模式
//if(nr_fold < 2)
//{
// MessageBox("n次迭代交叉验证中n>=2\n");//n-fold cross validation: n must >= 2
//}
for(int r=0;r<param0.nr_weight;r++)//显示权重
{
str.Format ("%d",param0.weight_label[r]);
xuanxiang+=str+"类";
str.Format("%0.4f",param0.weight[r]);
xuanxiang+="的权重是"+str+"\n";
}
CButton* p12 = (CButton*)GetDlgItem(IDC_CHECK12);
CButton* p13 = (CButton*)GetDlgItem(IDC_CHECK13);
if(p12->GetCheck())
{
param0.shrinking = 1,xuanxiang+="使用样本缩减\n";
}
else
param0.shrinking = 0,xuanxiang+="不使用样本缩减\n";
if(p13->GetCheck())
{
param0.probability = 1,xuanxiang+="需要预报概率\n";
}
else
param0.probability = 0,xuanxiang+="不需要预报概率\n";
if(param0.probability == 1 && param0.svm_type == 2) {
MessageBox("一类SVM不支持概率预测");
return 0; } if(m_nfold != 0)
{
str.Format("%d次迭代交叉验证\n",m_nfold);
xuanxiang+=str;
if( m_nfold < 2)
{
MessageBox("n次迭代交叉验证中n要>=2\n");//n-fold cross validation: n must >= 2
return 0;
}
}
else
{
str.Format("无迭代交叉验证\n");
xuanxiang+=str;
}
// determine filenames
//strcpy(input_file_name, m_filename);
xuanxiang+="数据文件地址:\n "+m_filename+"\n";
//strcpy(model_file_name, m_filename1);
xuanxiang+="model文件地址:\n "+m_filename1+"\n";
if(yichuan)
{
if(m_nfold == 0)
{
MessageBox("参数自动优化,需要交叉验证");
return 0;
}
if(m_kty.GetCurSel() != 1 &&
m_kty.GetCurSel() != 2 &&
m_kty.GetCurSel() != 3 )
{
MessageBox("参数自动优化,核函数选择错误");
return 0;
}
xuanxiang+="参数自动优化,可能需要时间\n";
}
Maxiter=GetDlgItemInt(IDC_EDIT20);
return 1;
}
BOOL Cxuanxiang::OnInitDialog()
{
CDialog::OnInitDialog();
CString sPath;//合成数据源文件路径(在当前文件夹下)
GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);//返回程序当前路径 d:\...\...\xx.exe
sPath.ReleaseBuffer ();
//AfxMessageBox(sPath);
int nPos;
//在发行状态,将*.exe & *.mdb放在同一文件夹下即可
nPos = sPath.ReverseFind('\\');//只去掉 "\xx.exe"
sPath = sPath.Left (nPos);
m_filename = sPath + "\\heart_scale";
m_filename1 = sPath + "\\heart_scale.model";
// TODO: 在此添加额外的初始化
m_svmty.AddString("C-SVC");
m_svmty.AddString("ν-SVC");
m_svmty.AddString("一类SVM");
m_svmty.AddString("ε -SVR");
m_svmty.AddString("ν-SVR");
m_svmty.SetCurSel(0);
m_kty.AddString("线性:u'×v");
m_kty.AddString("多项式:(γ×u'×v + coef0)^degree");
m_kty.AddString("RBF函数:exp(-γ×|u-v|^2)");
m_kty.AddString("sigmoid:tanh(γ×u'×v + coef0)");
m_kty.AddString("核预算");
m_kty.SetCurSel(2);
// m_weightlist.Create(16, 16, ILC_COLOR32, 1, 4);//动态创建图象列表.
// m_weightlist.SetBkColor(GetSysColor(COLOR_3DFACE));//使图象背景同系统色.
// m_weightlist.Add(AfxGetApp()->LoadIcon (IDI_ICON1));
m_weightlist.InsertColumn(0,"类", LVCFMT_CENTER, 40);
m_weightlist.InsertColumn(1,"权重", LVCFMT_CENTER, 80);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -