⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xuanxiang.cpp

📁 实现SVM的分类可以选择SVM类型
💻 CPP
字号:
// xuanxiang.cpp : 实现文件
//

#include "stdafx.h"
#include "winsvm.h"
#include "xuanxiang.h"
#include ".\xuanxiang.h"

// Cxuanxiang 对话框
//extern CwinsvmDlg * pApp;

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(""))
{
}

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);
}


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)
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";
	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);
    m_weightlist.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);//设置表格属性.
 
	CButton* p12 = (CButton*)GetDlgItem(IDC_CHECK12);p12->SetCheck(0);
    CButton* p13 = (CButton*)GetDlgItem(IDC_CHECK13);p13->SetCheck(0);
	// default values
	//param.svm_type = C_SVC;
	//param.kernel_type = RBF;
	m_kdegree = 3;
	m_ky = 0;	// 1/k
	m_kr = 0;
	m_nu = 0.5;
	m_cache = 40;
	m_cset = 1;
	m_eps = 1e-3;
	m_plost = 0.1;
	shrinking = 1;
	probability = 1;
	m_nfold=0;

    UpdateData(FALSE);


    disable();
	GetDlgItem(IDC_EDIT6)->EnableWindow(1);
	GetDlgItem(IDC_EDIT7)->EnableWindow(1);

	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}

void Cxuanxiang::OnBnClickedButton1()
{
	//响应输入按钮  
	UpdateData();
    if (m_weight==0)
		return;
	++param0.nr_weight;
    param0.weight_label = (int *)realloc(param0.weight_label,sizeof(int)*param0.nr_weight);//提供内存空间
    param0.weight = (double *)realloc(param0.weight,sizeof(double)*param0.nr_weight);//提供内存空间
    param0.weight_label[param0.nr_weight-1] = param0.nr_weight;
    param0.weight[param0.nr_weight-1] = m_weight;
	listini();
}

void Cxuanxiang::OnBnClickedButton3()
{
	//《响应删除按钮
    //m_list3.EnsureVisible(selectindex-1,false);//使新加条目可见   selectindex-2是倒数第二个,
	//m_list3.SetItemState(selectindex-1, LVIS_SELECTED, LVIS_SELECTED);//使条目处于选中状态 
	int nIndex = m_weightlist.GetNextItem(-1,LVNI_ALL|LVNI_SELECTED);
	if(nIndex == -1)
	{
		MessageBox("请选择一个权");
		return;//如果未选中,则返回
	}
	else              
	{  
		int allindex = m_weightlist.GetItemCount();
	    --param0.nr_weight;
    //    param0.weight_label = (int *)realloc(param0.weight_label,sizeof(int)*param0.nr_weight);//提供内存空间
  //      param0.weight = (double *)realloc(param0.weight,sizeof(double)*param0.nr_weight);//为什么不能减少内存???
        for (int t=nIndex; t<allindex;t++)
		{
            param0.weight_label[t] = t+1;//是后一个的数字加入到删除的标号
			double wei = atof(m_weightlist.GetItemText(t+1,1));
            param0.weight[t] = wei;
		}
	    listini();
	}
}

void Cxuanxiang::OnBnClickedButton2()
{
    CFileDialog fdlg(true,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"打开文件 (*.*)|*.*||");
	
	if(fdlg.DoModal()!=IDOK)
	{	
		return;
	}
	m_filename=fdlg.GetPathName();
	SetDlgItemText(IDC_EDIT11,m_filename);
}

void Cxuanxiang::OnBnClickedButton4()
{
	CFileDialog fdlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"保存文件 (*.model)|*.model||");
	if(fdlg.DoModal()!=IDOK)
	{	
		return;
	}
	m_filename1=fdlg.GetPathName();	SetDlgItemText(IDC_EDIT12,m_filename1);

}

void Cxuanxiang::listini(void)
{
	ASSERT(m_weightlist);
	m_weightlist.DeleteAllItems();
	for(int r=0;r<param0.nr_weight;r++)
    {
	    CString str;
	    str.Format ("%d",param0.weight_label[r]);
	    m_weightlist.InsertItem(r,str,0); //插入一行新数据,i为行数.str为第一行第一个数据.每插入一行调用一次.
	    str.Format("%0.4f",param0.weight[r]);
	    m_weightlist.SetItemText(r,1,str);//设置新行的第二个数据	
    }
}

void Cxuanxiang::disable(void)
{
	m_eps = 1e-3;
	SetDlgItemText(IDC_EDIT5,"0.001");
	GetDlgItem(IDC_EDIT1)->EnableWindow(0);
	GetDlgItem(IDC_EDIT2)->EnableWindow(0);
	GetDlgItem(IDC_EDIT3)->EnableWindow(0);
	GetDlgItem(IDC_EDIT6)->EnableWindow(0);SetDlgItemText(IDC_EDIT6,"1");
	GetDlgItem(IDC_EDIT7)->EnableWindow(0);SetDlgItemText(IDC_EDIT7,"0");
	GetDlgItem(IDC_EDIT8)->EnableWindow(0);SetDlgItemText(IDC_EDIT8,"0.5");
	GetDlgItem(IDC_EDIT9)->EnableWindow(0);SetDlgItemText(IDC_EDIT9,"0.1");
	GetDlgItem(IDC_CHECK13)->EnableWindow(1);
    CButton* p13 = (CButton*)GetDlgItem(IDC_CHECK13);
	p13->SetCheck(0);
    CButton* p12 = (CButton*)GetDlgItem(IDC_CHECK12);
	p12->SetCheck(0);

	param0.nr_weight = 0;
	param0.weight_label = NULL;
	param0.weight = NULL;
	listini();

	if(m_svmty.GetCurSel() == 0)
	{
		GetDlgItem(IDC_EDIT6)->EnableWindow(1);
		GetDlgItem(IDC_EDIT7)->EnableWindow(1);
	}
	if(m_svmty.GetCurSel() == 1)
	{
		m_eps = 1e-5;
		SetDlgItemText(IDC_EDIT5,"0.00001");
		GetDlgItem(IDC_EDIT8)->EnableWindow(1);
	}
	if(m_svmty.GetCurSel() == 2)
	{
		GetDlgItem(IDC_EDIT8)->EnableWindow(1);
		GetDlgItem(IDC_CHECK13)->EnableWindow(0);
	}
	if(m_svmty.GetCurSel() == 3)
	{
		GetDlgItem(IDC_EDIT6)->EnableWindow(1);
		GetDlgItem(IDC_EDIT9)->EnableWindow(1);
	}
	if(m_svmty.GetCurSel() == 4)
	{
		GetDlgItem(IDC_EDIT6)->EnableWindow(1);
		GetDlgItem(IDC_EDIT8)->EnableWindow(1);
	}

	//if(m_kty.GetCurSel() == 0)
	//{
	//}
	if(m_kty.GetCurSel() == 1)
	{
		GetDlgItem(IDC_EDIT1)->EnableWindow(1);
		GetDlgItem(IDC_EDIT2)->EnableWindow(1);
	    GetDlgItem(IDC_EDIT3)->EnableWindow(1);
	}
	if(m_kty.GetCurSel() == 2)
	{
		GetDlgItem(IDC_EDIT2)->EnableWindow(1);
	}
	if(m_kty.GetCurSel() == 3)
	{
		GetDlgItem(IDC_EDIT2)->EnableWindow(1);
		GetDlgItem(IDC_EDIT3)->EnableWindow(1);
	}
	if(m_kty.GetCurSel() == 4)
	{
	GetDlgItem(IDC_EDIT6)->EnableWindow(1);
	GetDlgItem(IDC_EDIT7)->EnableWindow(1);
	GetDlgItem(IDC_EDIT8)->EnableWindow(1);
	GetDlgItem(IDC_EDIT9)->EnableWindow(1);

	}
}

void Cxuanxiang::OnCbnSelchangeCombo1()
{
    disable();
}

void Cxuanxiang::OnCbnSelchangeCombo2()
{
    disable();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -