smo算法c语言源代码,支持向量机SMO算法求解过程分析

1.SVM对偶函数最后的优化问题

34f5e6e58e7b50f573dae5241e76e8ac.png

e3307dad5877735af8c40bca84087cde.png

56eb16a2effdbf0df5e069af97792cb6.png

c2eb70a2b794743a2701829d5f99c636.png

2. 对核函数进行缓存

f4710ec0b25b6148903006af72933dc2.png

由于该矩阵是对称矩阵,因此在内存中的占用空间可以为m(m+1)/2

映射关系为:

099422f2b83ef20268857a09fdfa061d.png

#define OFFSET(x, y) ((x) > (y) ? (((x)+1)*(x) >> 1) + (y) : (((y)+1)*(y) >> 1) + (x))

//...

for (unsigned i = 0; i < count; ++i)

for (unsigned j = 0; j <= i; ++j)

cache[OFFSET(i, j)] = y[i] * y[j] * kernel(x[i], x[j], DIMISION);

//...

3. 求解梯度

既然α值是变量,因此对α值进行求导,后面根据梯度选取α值进行优化。

梯度:

06267525e23e4f6c0e4fa6d9a8da7216.png

for (unsigned i = 0; i < count; ++i)

{

gradient[i] = -1;

for (unsigned j = 0; j < count; ++j)

gradient[i] += cache[OFFSET(i, j)] * alpha[j];

}

4f86efeca05dc48db1fba06503384760.png

78a7dd5d7212a7bba46e0b65d4fdf4ef.png

若使W最大,则当α减少时,G越大越好。反之,G越小越好。

4. 序列最小化法(SMO)的约束条件

每次选取2个α值进行优化,其它α值视为常数,根据约束条件

56eb16a2effdbf0df5e069af97792cb6.png得:

203ec4bb7c6b0ca0cc68ccbe102d2a53.png

2183a722f00e9cc1c7327c54e2273652.png

1b105e4fc2f1de34555aa04585822ee8.png

进行优化之后:

08b7bad2d77ecfef161c76d13a4edee9.png

5. 制定选取规则

由于α的范围在区间[0,C],所以△α受α约束

d85dd1a9174d2703eac09254d9108b1a.png

df24631ae59b72120445d22a3e0af001.png

78014224ac6f745b83593e48488357e0.png

511443dc9b9569a7cd1de429fb319b75.png

df959667a8d7796c7be4de346f0e2046.png

212aac1a46acddc02733c5fb17133159.png

5270443daa8792f5716aad8363eda93a.png

eca97bb372760330a1b9fc0c90e0c75f.png

855c2a1f45ce6f0ff931a093f890f166.png

若选取的

e7b9d04173af5bbaec8b9824b1d2f407.png

29fd65de4b902d0996ef1bf593c770eb.png异号,即λ=-1,则

f4f4ab5a5a48137ce169d4307a8c5d28.png

d537bbeb148ccc40c4c9c4ceb6ac8d37.png增减性相同

假设

ac13b5b16fa3d52e860b6b3dd85d62b7.png

d9d856c128f8b8c181a175aedc2b3fcc.png

4124ed620c03eb4b3b6f108ed61c0c36.png,则

96721ffdbfca1e6eb55e2dfcdf80dc7a.png,此时应选取

164880cadd42046e1c5b28cc402060d1.png

上述命题可化为(注:

584ceb7e911ce06aa92a08cfacb946c7.png

e37e5eb584b5a1388cb2a1899e42915b.png等价)

fd118294ff0609a0d5632e1e2f470b78.png

af7208564db8658449ee2322c6620679.png

若选取的

e7b9d04173af5bbaec8b9824b1d2f407.png

29fd65de4b902d0996ef1bf593c770eb.png同号,即λ=1,则

f4f4ab5a5a48137ce169d4307a8c5d28.png

d537bbeb148ccc40c4c9c4ceb6ac8d37.png增减性相异

4124ed620c03eb4b3b6f108ed61c0c36.png,则

a7ab77db8cdaaa6dc95f05dcf6a7e7f8.png,此时应选取

a3a985d7fcea2878a884ef998745acfb.png,

24a68ea40920acaa3793e83944cbfcde.png

上述命题可化为(注:

584ceb7e911ce06aa92a08cfacb946c7.png

e37e5eb584b5a1388cb2a1899e42915b.png等价)

9d457cfb378c8494064b743c239c9c15.png

8147742a3bc09b77a8361e91f253192e.png

105e74222af6a0b441dc2a30e8004fe4.png

af7208564db8658449ee2322c6620679.png

将上述结论进行整理,可得(为了简便此处只选取G前的符号与y的符号相异的情况)

a7aca5ee6f96332215c13e4e2f5e41b9.png

b85c697b3cfa625f0727b56282f299ad.png

unsigned x0 = 0, x1 = 1;

//根据梯度选取进行优化的alpha值

{

double gmax = -DBL_MAX, gmin = DBL_MAX;

for (unsigned i = 0; i < count; ++i)

{

if ((alpha[i] < C && y[i] == POS || alpha[i] > 0 && y[i] == NEG) && -y[i] * gradient[i] > gmax)

{

gmax = -y[i] * gradient[i];

x0 = i;

}

else if ((alpha[i] < C && y[i] == NEG || alpha[i] > 0 && y[i] == POS) && -y[i] * gradient[i] < gmin)

{

gmin = -y[i] * gradient[i];

x1 = i;

}

}

}

6. 开始进行求解

alpha要求在区间[0,C]内,对不符合条件的alpha值进行调整,调整规则如下。

1787604fcaf53a123a7e1cb95eb43b53.png

22a9e4fd0af4876c747ac032727cbfd9.png

d84138399da048c0d205ed5ed9b79838.png

438847e7e17637b1670fdb4eb6414d84.png

dbf2887257d062604e5993d6801e2dbb.png

fe834bcc4cef80937c566af0ee42a81e.png

8a7d325386f67ee304e2d9190538e5e1.png

7acf27c89b6dc5066b326c6731c2b2ca.png

分2种情况,若λ=-1,即:

607c381d805074fb6b457166bf5fe4d2.png

代入后得:

05d6a8fa187c0ec6cee7ec7304a40c7f.png

5dabd497a4816d8c282cce38eb8ed23e.png

0638a8cd5efe042280aa949d7db63b98.png

6f0201b3626928a5c55bff6dce9581f5.png

a3a637937bbd194830f2e76161b542d9.png

if (y[x0] != y[x1])

{

double coef = cache[OFFSET(x0, x0)] + cache[OFFSET(x1, x1)] + 2 * cache[OFFSET(x0, x1)];

if (coef <= 0) coef = DBL_MIN;

double delta = (- gradient[x0] - gradient[x1]) / coef;

double diff = alpha[x0] - alpha[x1];

alpha[x0] += delta;

alpha[x1] += delta;

unsigned max = x0, min = x1;

if (diff < 0)

{

max = x1;

min = x0;

diff = -diff;

}

if (alpha[max] > C)

{

alpha[max] = C;

alpha[min] = C - diff;

}

if (alpha[min] < 0)

{

alpha[min] = 0;

alpha[max] = diff;

}

}

若λ=1,即:

45fdfc71e501d7041bcf6bfab5ea9250.png

4fd687fbc400c91dd786e2ca216b5159.png

774287fa74ed21117aaff2503bccf828.png

0638a8cd5efe042280aa949d7db63b98.png

f4fbe83b9d725b0dfbfb269d449a7cb6.png

49722d377ac3f1fc2b77055fdb405d98.png

{

double coef = cache[OFFSET(x0, x0)] + cache[OFFSET(x1, x1)] - 2 * cache[OFFSET(x0, x1)];

if (coef <= 0) coef = DBL_MIN;

double delta = (-gradient[x0] + gradient[x1]) / coef;

double sum = alpha[x0] + alpha[x1];

alpha[x0] += delta;

alpha[x1] -= delta;

unsigned max = x0, min = x1;

if (alpha[x0] < alpha[x1])

{

max = x1;

min = x0;

}

if (alpha[max] > C)

{

alpha[max] = C;

alpha[min] = sum - C;

}

if (alpha[min] < 0)

{

alpha[min] = 0;

alpha[max] = sum;

}

}

然后进行梯度调整,调整公式如下:

32d1b30d4b4c458ca1cbed4068930c16.png

for (unsigned i = 0; i < count; ++i)

gradient[i] += cache[OFFSET(i, x0)] * delta0 + cache[OFFSET(i, x1)] * delta1;

7.进行权重的计算

计算公式如下:

601f15d2eff495fb238538d9048b2f32.png

43580a93ed8bffe4ae9a9a74172d6e51.png

double maxneg = -DBL_MAX, minpos = DBL_MAX;

SVM *svm = &bundle->svm;

for (unsigned i = 0; i < count; ++i)

{

double wx = kernel(svm->weight, data[i], DIMISION);

if (y[i] == POS && minpos > wx)

minpos = wx;

else if (y[i] == NEG && maxneg < wx)

maxneg = wx;

}

svm->bias = -(minpos + maxneg) / 2;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值