资源简介
该C++代码,有助于理解SVM算法,通俗易懂,附带两个标签类,成功实现正确分类,。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
代码片段和文件信息
#define _CRT_SECURE_NO_DEPRECATE
#include
#include
#include
#include
#include
#include
#include
#define feature_num 15
#define lable_num 20
float data_mat[lable_num][feature_num];
float res_mat[lable_num];
using namespace std;
void main(void)
{
//int file(void)
//{
FILE *f1*f2;
int i = 0 j = 0k=0;
f1 = fopen(“bedroom.txt“ “r“);
f2=fopen(“lable.txt““r“);
while(!feof(f1))
{
if(j != feature_num-1)
fscanf(f1 “%f “ &data_mat[i][j++]);//注意此处有个空格
else
{
fscanf(f1 “%f“ &data_mat[i][j]);
j = 0;
++i;
}
}
while(!feof(f2))
fscanf(f2 “%f “ &res_mat[k++]);
fclose(f1);
fclose(f2);
int t;
double y[20] = {0}; //对x的分类结果1或-1
double alphas[lable_num]={0};
double a_y[lable_num]={0}; //a[i]*y[i]
double w[feature_num]={0};
double b=0;
double aiold = 0ajold = 0ajnew = 0ainew = 0;
double HL;
double c=0.6Ei=0Ej=0;
double tolerance=1e-3;
int itermaxIter=400alphapairsChanged = 0;
double limit1limit2etabinewbjnew; //HL的上下限
double K_ij=0K_ii=0K_jj=0K_ji=0; //2K12-K11-K22
//ofstream f4;
//f4.open(“result.txt“);
srand(unsigned(time(0)));
iter=0;
while(iter {
Ei=0Ej=0;
K_ij=0;
K_ii=0;
K_jj=0;
K_ji=0;
alphapairsChanged = 0;
for(i=0;i {
for(k=0;k a_y[k]=alphas[k]*res_mat[k];///a[i]*y[i]
for(t=0;t {
w[t]=0;
}
for(k=0;k {
for(t=0;t {
w[k]+=a_y[t]*data_mat[t][k];
}
}
Ei=0Ej=0;
for(k=0;k {
Ei+=w[k]*data_mat[i][k]; //线性核求Ei
}
Ei=Ei+b;
Ei=Ei-res_mat[i];
if( ((res_mat[i]*Ei < -tolerance ) & (alphas[i] < c) )| ((res_mat[i]*Ei < -tolerance > tolerance) & (alphas[i] > 0))){
while(1) //随机选取与i不同的j
{
j=int(rand()%lable_num);
if(j!=i)
break;
}
for(k=0;k {
Ej+=w[k]*data_mat[j][k]; //求Ej,这里使用线性核
}
Ej=Ej+b;
Ej=Ej-res_mat[j];
aiold=alphas[i];
ajold=alphas[j];
limit1=ajold-aiold;
limit2=aiold+ajold;
if(res_mat[i]!=res_mat[j])
{
if(limit1>0)
{
L=limit1;
H=c;
}
else
{
L=0;
H=c+limit1;
}
}
else
{
if(limit2>c)
{
L=limit2-c;
H=c;
}
else
{
L=0;
H=limit2;
}
}
if(H==L)
continue;
K_ij=0;
K_ii=0;
K_jj=0;
K_ji=0;
for(k=0;k {
K_ij+=data_mat[i][k]*data_mat[j][k];
K_ii+=data_mat[i][k]*data_mat[i][k];
K_jj+=data_mat[j][k]*data_mat[j][k];
K_ji+=data_mat[j][k]*data_mat[i][k];
}
eta=2*K_ij-K_ii-K_jj; //w(a2)的2阶导数
if(eta>=0)
continue;
ajnew=ajold-res_m
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4601 2017-08-23 10:01 SVM算法\SVM.cpp
文件 3018 2017-08-01 15:31 SVM算法\bedroom.txt
文件 3020 2017-08-01 22:41 SVM算法\bedroom1.txt
目录 0 2017-09-04 11:46 SVM算法\
- 上一篇:基于mfc tcp 文件传输 源代码
- 下一篇:C语言C++通用自定义log打印函数
评论
共有 条评论