資源簡介
該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]??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打印函數
評論
共有 條評論