#include "stdio.h"

#include <vector>

using namespace std;



float function(float alfa[5],float H[5][5],float sign[5])

{



        float ret = alfa[0]+alfa[1]+alfa[2]+alfa[3]+alfa[4];

        for(int j=0;j<5;++j)

        {

                float t=0.0;

                for(int i=0;i<5;++i)

                {

                        t+=sign[i]*alfa[i]*H[j][i];

                }

                ret += -1*(t*alfa[j]*sign[j])/2;

        }

        return ret;

}

int main(void)

{

        float matrix[5][4]={

                {1,5,1},

                {1,2,1},

                {2,2,-1},

                {2,1,-1},

                {1,1,-1}};

        float H[5][5];

        vector<float> c1;

        vector<float> c2;

        for(int i=0;i<5;++i)

        {

                c1.push_back(matrix[i][0]);

                c2.push_back(matrix[i][1]);

        }

        for(int i=0;i<5;++i)

        {

                for(int j=0;j<5;++j)

                {

                        H[i][j]=c1[i]*c1[j]+c2[i]*c2[j];

                        printf("%f\t",H[i][j]);

                }

                printf("\n");

        }

        float alfa[5]={3,3,2,2,2};

        float sign[5];

        for(int i=0;i<5;++i)

                sign[i]=matrix[i][2];

        float last_r = function(alfa,H,sign);

        float new_r;

        float con_r;

        for(int i=0;i<5;++i)

        {

                for(int j=0;j<5;j++)

                {

                        printf("%f,alfa={%f,%f,%f,%f,%f}\n",last_r,alfa[0],alfa[1],alfa[2],alfa[3],alfa[4]);

                        if(i==j) continue;

                        else if((alfa[i]<0.01&&alfa[i]>-0.01)&&(alfa[j]<0.01&&alfa[j]>-0.01)) continue;

                        else if((alfa[j]>0.01)&&(alfa[i]<0.01&&alfa[i]>-0.01))

                        {

                                while(alfa[j]>0.01){

                                        alfa[i]+=0.1;

                                        new_r = function(alfa,H,sign);

                                        if( new_r > last_r )

                                        {

                                                alfa[j] -= 0.1*sign[i]*sign[j];

                                                last_r = function(alfa,H,sign);

                                        }

                                        else

                                        {

                                                alfa[i]-=0.1;

                                                break;

                                        }

                                };

                        }

                        else if((alfa[i]>0.01)&&(alfa[j]<0.01&&alfa[j]>-0.01))

                        {

                                while(alfa[i]>0.01){

                                        alfa[j]+=0.1;

                                        new_r = function(alfa,H,sign);

                                        if( new_r > last_r )

                                        {

                                                alfa[i] -= 0.1*sign[i]*sign[j];

                                                last_r = function(alfa,H,sign);

                                        }

                                        else

                                        {

                                                alfa[j]-=0.1;

                                                break;

                                        }

                                };

                        }

                        else

                        {



                                alfa[j]+=0.1;

                                new_r = function(alfa,H,sign);

                                alfa[j]-=0.2;

                                con_r = function(alfa,H,sign);

                                alfa[j]+=0.1;



                                if(new_r>con_r&&new_r>last_r)

                                {

                                        while(alfa[i]>0.01&&alfa[j]>0.01)

                                        {

                                                alfa[j] += 0.1;

                                                alfa[i] -= 0.1*sign[i]*sign[j];

                                                new_r = function(alfa,H,sign);

                                                if(new_r > last_r)

                                                {

                                                        last_r = new_r;

                                                }

                                                else

                                                {

                                                alfa[j] -= 0.1;

                                                alfa[i] += 0.1*sign[i]*sign[j];

                                                break;

                                                }

                                        };



                                }

                                else if(con_r>new_r&&con_r>last_r)

                                {

                                        while(alfa[i]>0.01&&alfa[j]>0.01)

                                        {

                                                alfa[j] -= 0.1;

                                                alfa[i] += 0.1*sign[i]*sign[j];

                                                con_r = function(alfa,H,sign);

                                                if(con_r > last_r)

                                                {

                                                        last_r = con_r;

                                                }

                                                else

                                                {

                                                alfa[j] += 0.1;

                                                alfa[i] -= 0.1*sign[i]*sign[j];

                                                break;

                                                }

                                        }

                                }

                                else

                                {}

                        }



                }

        }

        printf("%f,alfa={%f,%f,%f,%f,%f}\n",last_r,alfa[0],alfa[1],alfa[2],alfa[3],alfa[4]);

        return 0;

}

SMO实现的更多相关文章

  1. 机器学习——支持向量机(SVM)之Platt SMO算法

    Platt SMO算法是通过一个外循环来选择第一个alpha值的,并且其选择过程会在两种方式之间进行交替: 一种方式是在所有数据集上进行单遍扫描,另一种方式则是在非边界alpha中实现单遍扫描. 所谓 ...

  2. 机器学习——支持向量机(SVM)之拉格朗日乘子法,KKT条件以及简化版SMO算法分析

    SVM有很多实现,现在只关注其中最流行的一种实现,即序列最小优化(Sequential Minimal Optimization,SMO)算法,然后介绍如何使用一种核函数(kernel)的方式将SVM ...

  3. 支持向量机原理(四)SMO算法原理

    支持向量机原理(一) 线性支持向量机 支持向量机原理(二) 线性支持向量机的软间隔最大化模型 支持向量机原理(三)线性不可分支持向量机与核函数 支持向量机原理(四)SMO算法原理 支持向量机原理(五) ...

  4. 借One-Class-SVM回顾SMO在SVM中的数学推导--记录毕业论文5

    上篇记录了一些决策树算法,这篇是借OC-SVM填回SMO在SVM中的数学推导这个坑. 参考文献: http://research.microsoft.com/pubs/69644/tr-98-14.p ...

  5. Index was outside the bounds of the array. (Microsoft.SqlServer.Smo)

    本地ssms是 安装Sqlserver 2008 r2 自带的 远端的server是sqlserver2014 可以连接,可以执行查询语句.但是,不能使用ssms生成对象的脚本.推测ssms 2008 ...

  6. 序列最小最优化算法(SMO)-SVM的求解(续)

    在前一篇文章中,我们给出了感知器和逻辑回归的求解,还将SVM算法的求解推导到了最后一步,在这篇文章里面,我们将给出最后一步的求解.也就是我们接下来要介绍的序列最小最优化算法. 序列最小最优化算法(SM ...

  7. SVM-非线性支持向量机及SMO算法

    SVM-非线性支持向量机及SMO算法 如果您想体验更好的阅读:请戳这里littlefish.top 线性不可分情况 线性可分问题的支持向量机学习方法,对线性不可分训练数据是不适用的,为了满足函数间隔大 ...

  8. SMO推导和代码-记录毕业论文4

    SMO的数学公式通过Platt的论文和看这个博客:http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html,大概弄懂了.推导以后 ...

  9. SVM之SMO最小序列

    转载自:JerryLead http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html 11 SMO优化算法(Sequential ...

  10. 附加数据库对于服务器失败(Microsoft.SqlServer.Smo),无法升级数据库,因为它是只读的,或者具有只读文件

    今天在将一个 SQL Server 2000 数据库附加到 SQL Server 2005时出现如下的错误:附加数据库对于服务器失败(Microsoft.SqlServer.Smo),无法升级数据库t ...

随机推荐

  1. 实例演示如何在spring4.2.2中集成hibernate5.0.2并创建sessionFactory

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/49388209 文章作者:苏生米沿 本文目的:使用spring4.2.2集成hibern ...

  2. Python实现Mysql数据库连接池

    python连接Mysql数据库: python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都是独立的去请求访问,相当浪费资源,而且访 ...

  3. shiro salt

    1.1 散列算法 散列算法一般用于生成一段文本的摘要信息,散列算法不可逆,将内容可以生成摘要,无法将摘要转成原始内容.散列算法常用于对密码进行散列,常用的散列算法有MD5.SHA.分享牛系列,分享牛专 ...

  4. Ubuntu14下安装svn仓库,以及权限配置

    sudo apt-get update 接下来安装svn apt-get install subversionapt-get install libapache2-svn 检查svn是否安装成功了: ...

  5. 大页内存(HugePages)在通用程序优化中的应用

    今天给大家介绍一种比较新奇的程序性能优化方法-大页内存(HugePages),简单来说就是通过增大操作系统页的大小来减小页表,从而避免快表缺失.这方面的资料比较贫乏,而且网上绝大多数资料都是介绍它在O ...

  6. 百度地图SDK3.4的使用

    使用过百度地图的开发者应该都知道原始百度地图的开发的基本流程,但是随着百度地图的更新,百度地图的api有了翻天覆地的变化,最新版本的sdk为v3.4 2015年4月14日上线,优化了许多接口的设计,简 ...

  7. 05 利用Appliction 传值Activity

    步骤一:新建一个类继承Application必须是public class 不然直接奔溃 步骤二:在清单文件AndroidManifest.xml的application添加name属性 值为com. ...

  8. 【一天一道LeetCode】#231. Power of Two

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  9. 【一天一道LeetCode】#258. Add Digits

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  10. Android最佳实践之SystemBar状态栏全版本适配方案

    前言 自从MD设计规范出来后,关于系统状态栏的适配越受到关注,因为MD在5.0以后把系统状态栏的颜色改为可由开发者配置的,而在5.0之前则无法指定状态栏的颜色,所以这篇就说说使用Toolbar对系统状 ...