SVM支持向量机分类算法C++实现 零调库

代码中的alpha和有些教材中的lamda是同意义的值,在此记录说明

bits/stdc++.h是标准C和标准C++库的汇总库,不属于标准C/C++,但是省事。很多编译器是支持的,VS不支持

样本等均为随机生成

可以通过更改K函数修改核函数,此处为线性核

#include 
#define vd vector
#define vvd vector
#define ull long long unsigned int
#define MY_RAND_MAX ((RAND_MAX<<15)|RAND_MAX)
using namespace std;

//#define DEBUG
//向量运算
template 
T operator* (const vector&AT,const vector&B){
    T sum=0;
    for(ull i=0;i
vector operator*(const vector&A,T k){
    vector kA(A);
    for(auto&x:kA)
        x*=k;
    return kA;
}

template 
vector operator*(T k,const vector&A){
    vector kA(A);
    for(auto&x:kA)
        x*=k;
    return kA;
}

//生成随机数
inline double my_rand(){
    return (rand()<<15)|rand();
}

inline double my_rand_double(){
    return my_rand() / double(MY_RAND_MAX);
}

inline double my_rand_double(double st,double ed){
    return my_rand_double()*(ed-st)+st;
}

//esp
const double esp=1e-7;
const double inf=DBL_MAX;
//α表 E表 K表
vd alpha,E;
vvd K;
//训练集
vvd x;
vd y;
//测试集
vvd x_test;
vd y_test;
//生成训练集样本的分类标准
double b;
vd omega;

//训练集样本容量与维度,测试集容量
int n,m;
int n_test;

//训练结果
double b_star=0;

//返回由alpha计算得到的omega_star
void omega_star(vd&res){
    res.clear();
    res.resize(m,0);
    for(int i=0;iesp){
        for(int j=0;jesp){
            if(abs(y[j]-1.0)H)
        alpha_p2_new=H;
    else if(alpha_p2_new=1-esp;
        else
            return g(i)<=-1+esp;
    }
    else {
        return abs(y[i]-g(i))<=esp;
    }
}

bool test(int i,int j){
    return E[i]*E[j]<0;
    /*return abs(E[i]-E[j])>0.1;*/
}

void run(){
    bool flag=true;
    int ct=0;
    #ifdef DEBUG
    int loop = 0;
    while(flag){
        cout<esp&&alpha[i]>esp))){
                flag=true;
                step(i,j);
#ifdef DEBUG
                cout<<"(i,j) = "<<'('<esp) cntf0++;
                if(cntf0>=n*0.2&&ct==0) ct=1;
                if(ct==1&&cntf0<=n*0.1) ct=2;

//                if(KKT(i))
//                    break;
            }
        }
    }
    #ifdef DEBUG
    cout<<"loop="<0)
            y[i]=1;
        else
            y[i]=-1;
    }

    init_K();
    alpha.resize(n);
    E.resize(n);

    set_E();

#ifdef DEBUG
    cout<<"train_set:"<0)
            y_test[i]=1;
        else
            y_test[i]=-1;
    }
    int t=0;
    int f=0;
    for(int i=0;i0)
            ans=1;
        else
            ans=-1;
        if(ans==y_test[i])
            t++;
        else {
            f++;
            cout<<"false: ";
            for(int j=0;j

你可能感兴趣的:(支持向量机,分类,c++,机器学习,算法)