svm的c++代码编写,二维数据的硬间隔分类

没有引入软间隔和核函数,几乎是按照李航的统计学理论编写的代码:结果只是近似最优值,设置zer0和zerob可以直接印象计算的精度,合理的设计,可以很快达到最优值,而不是近似最优。也可以通过二维数组来添加维数,本文只测试了二维数据的样本。更新了算法了鲁棒性,可以处理更加复杂的情况。至于核函数的问题。仅仅需要修改一下内积的计算方式就行了。关键是加了几个判断准则,防止启发式算法SMO陷入局部最优。本文有些函数并未用到,但是是推导计算公式时必须的过程代码,其实李航的书只是最终化简后的计算方式。对第一个aj的选择,也可以用本文完全按照没有化简后公式计算的方法。但是aj的值和李航的差0.5倍左右,不过所求的结果完全一致。甚至迭代次数都一样。
/*********************************************************
**CopyRight by zhanghuanhuan, BNU in china, BeiJing ******
**********************************************************/

#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
double zer0 = 0.000001;
double zerob = 0.000000001;
struct arry
{
double x1;
double x2;
int  y;
};
struct W{
double w1;
double w2;
};

//求内积
double Inner_Product(arry a, arry b)
{
return a.x1*b.x1 + a.x2*b.x2;
}

//求Max
double Svm_max(double a[][2], vector<arry> x)
{
int i, j;
double sumai = 0;
double sum = 0;
for (i = 0; i < x.size(); i++)
{
sumai = sumai + a[i][1];
}
for (i = 0; i < x.size(); i++)
{
for (j = 0; j < x.size(); j++)
sum = sum + a[i][1] * a[j][1] * x[i].y*x[j].y*Inner_Product(x[i],x[j]);
}
return sumai - 0.5*sum;

}

//求C
double Svm_C(vector<arry> x, double a[][2], int m)
{
double c = 0;
int i;
for (i = 0; i < m; i++)
{
if (a[i][0] == 0)
c = c + a[i][1] * x[i].y;
}
return -c;
}

//计算系数项
double Svm_k_bi_b0(vector<arry> x, double a[][2], int m, arry xi)
{
double k = 0;
int i;
for (i = 0; i < m; i++)
{
if (a[i][0] == 0)
k = k + 0.5*xi.y*a[i][1] * x[i].y*Inner_Product(xi,x[i]);
}
return 1-k;
}

double Svm_k_bj_b1(vector<arry> x, double a[][2], int m, arry xj)
{
double k = 0;
int i;
for (i = 0; i < m; i++)
{
if (a[i][0] == 0)
k = k + 0.5*xj.y*a[i][1] * x[i
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值