带L1正则项SVM多分类问题,使用MindOpt优化

简介: 支持向量机(Support Vector Machine, SVM),是一类按监督学习方式对数据进行分类的线性分类器。其核心思想是在特征空间内找到使不同类别的样本间距最大的决策边界。SVM模型中经常会引入正则化项(regularization term)来提高模型鲁棒性或者引入先验知识。L1 - regularized SVM就是在模型中加入L1正则化项(也即 ||x||1 ),将特征向量的稀疏性(会令特征向量x中某一些参数等于0)这个先验知识引入到模型中,进而提高分类效率。

正则项是通过添加信息来解决不适定问题或者防止过拟合,其应用范围很广,包括机器学习、数据统计以及图像中。常见的正则项有L0、L1、L2,本文讲述的是关于L1正则项。L1正则化项是指权重向量x中各元素的绝对值之和,可以表示为||x||1。

在机器学习中,分类是指针对输入数据中的给定示例预测其类别标签的预测性建模问题。常见的分类任务有四种:二分类、多类别分类(本篇)、多标签分类、不平衡分类。


多类别分类是指具有两个以上类别标签的分类任务,通常使用多元概率分布模型来对多类别分类任务进行建模。可用于多类别分类任务的算法有:k最近邻算法、决策树、朴素贝叶斯、随机森林、梯度提升等,但用于二分类的算法逻辑回归和支持向量机(本篇)也适用于多类别分类问题。


支持向量机(Support Vector Machine, SVM),是一类按监督学习方式对数据进行分类的线性分类器。其核心思想是在特征空间内找到使不同类别的样本间距最大的决策边界。SVM模型中经常会引入正则化项(regularization term)来提高模型鲁棒性或者引入先验知识。L1 - regularized SVM就是在模型中加入L1正则化项(也即 ||x||1 ),将特征向量的稀疏性会令特征向量x中某一些参数等于0)这个先验知识引入到模型中,进而提高分类效率。


本文将讲述使用MindOpt优化带L1正则项SVM多分类问题。

问题描述


分类是机器学习领域中最基本的任务之一。其目的是建立输入向量x与分类变量y之间的映射关系。例如:


  • 在计算机视觉中,我们需要把一张张图片根据其内容分类为"动物","轮船", "植物"等类别,供下游的任务使用。在这个应用中,x就是图片像素组成的向量,而分类变量y则是指向其具体类别的标量。
  • 我们会把收到的电子邮件根据其标题,发件人,内容,附带图片或链接等分类为"重要邮件", "推销邮件", "垃圾邮件"等。在这个应用中,x就是电子邮件的向量化输入,y则是指向具体类别的标量。


问题模型


假设我们有m组数据 image.png , 其中 image.png 是特征向量, image.png 是特征向量 image.png 对应的类别标签。因此,所有的数据都属于这K个分类。


在多分类问题中,我们需要找到一个参数矩阵 image.png 来对未曾见过的数据样本 image.png 进行分类。例如,在得到参数矩阵 image.png 后,我们会计算 image.png 通过分类向量 image.png 的每个element的大小,我们可以确定当前数据样本 image.png 的类别。


image.png - regularized SVM的问题模型如下:


image.png


其中 image.png
是待优化的参数矩阵, image.png image.png 的第k行, image.png image.png
的第 image.png 行,其中 image.png 是第 image.png 个样本 image.png 所属的类别。 image.png 也是待优化的变量,其中 image.png 是非负标量。如果 image.png , 我们有 image.png ; 如果 image.png , 我们有 image.png .

建模为线性规划问题


为了把上面的 image.png - regularized SVM建模为线性规划问题,我们引入辅助变量 image.png ,其中 image.png 需要满足的约束为 image.png . 有了辅助变量 image.png , 我们可以把上面的SVM问题建模为线性规划问题:


image.png


其中 image.png 就是辅助变量 image.png
的第 image.png 行。以上问题进一步等价于


image.png


如果令 image.png , 我们有


image.png


将以上关系带入到上面的线性规划问题中,我们有


image.png


  • 变量: image.png , 其中每个变量都是非负的
  • 不等式约束: image.png 个不等式约束
  • 以上问题可以转化为

image.png


其中: image.png


准备数据


选择1:直接用示例数据


我们在文件夹 src/model/mnist.scale100_tianchi 存了一份已OK的数据。可在云上平台查看该示例数据。


点开后如下截图所示: image.png


选择2:通过mnist.scale数据集和libSVM生成数据


请参考原文C/S版代码原文来查看 选择2. 通过mnist.scale数据集和libSVM生成数据(含代码)章节来自行生成数据,数据生成所需的依赖库本Notebook暂不支持,请在个人电脑上运行生成数据,然后将数据上传上来(可以直接拖folder里)。

使用MindOpt求解器的API


直接采用求解器的API,需要查阅API文档来理解API的意思,没有建模语言可读性高。请参阅https://solver.damo.alibaba.com/doc/html/API%20reference/API-python/index.html来查看PythonAPI的使用说明。


关于Python的例子,在文档的5.建模与优化求解章节有Python的示例。这里是个LP的问题,我们可以参考:https://solver.damo.alibaba.com/doc/html/model/lp/linear%20optimization-python.html


下面我们分两种方式描述在本平台环境中的运行方法:


方法1:cell中直接输入代码运行

# LP_6_svm.py

from mindoptpy import *
import time

if __name__ == "__main__":
    
    # parameters
    data_folder = "./model/mnist.scale100_tianchi/"
    soln_file = "./model/LP_6_svm.sol"
    MDO_INFINITY = MdoModel.get_infinity()

    
    # read file meta for size of A
    f = open(data_folder+"meta", "r")

    A_size = []
    for line in f:
        num = int(line.split(' ')[-1][:-1])
        A_size.append(num)
    m, n = A_size[1], A_size[0]

    f.close()
    
    # read file b
    b = []
    f = open(data_folder+"b", "r")

    for line in f:
        b_element = float(line[:-1])
        b.append(b_element)

    f.close()
    
    # read file c
    c = []
    f = open(data_folder+"c", "r")

    for line in f:
        c_element = float(line[:-1])
        c.append(c_element)

    f.close()
    
    # --------Step 1. Establish LP model-----------

    model = MdoModel()
    
    try:
        # -----Step 2. Input model.-----------
        # Set minimize problem
        model.set_int_attr("MinSense", 1)


        # Add empty constraints.
        cons = []
        for j in range(m):
            cons_name = "c" + str(j)
            cons.append(model.add_cons(-MDO_INFINITY, b[j], None, cons_name))

        # Input columns. 
        f = open(data_folder+"A", "r")

        col = []
        for j in range(n):
            col.append(MdoCol())

        for idx, line in enumerate(f):
            line_lst = line.split('\t')
            row_id, col_id, val = int(line_lst[0]), int(line_lst[1]), float(line_lst[2][:-1])
            col[col_id].add_term(cons[row_id], val)

        # Add variables.
        # Note that the nonzero elements are inputted in a column-wise order here.
        x = []

        for j in range(n):
            x_name = "x" + str(j)
            x.append(model.add_var(0.0, MDO_INFINITY, c[j], col[j], x_name, False))

        print('LP model is established.\n')


        # ------Step3. Solve the problem and populate the result.-------
        model.solve_prob()
        model.display_results()
        time.sleep(0.01) #for print
        
        status_code, status_msg = model.get_status()
        if status_msg == "OPTIMAL":
            print("----\n")
            print("The solver terminated with an OPTIMAL status (code {0}).".format(status_code))

            print("目标函数最优取值是: {0}".format(model.get_real_attr("PrimalObjVal")))
            print(" - 原始解 : {}".format(model.get_real_attr("PrimalObjVal")))
            print(" - 对偶解 : {}".format(model.get_real_attr("DualObjVal")))
            print(" - 求解耗时 : {} sec.".format(model.get_real_attr("SolutionTime")))
            print("变量太多,请打开结果文件"+soln_file+"来查看变量取值")
                
        else:
            print("Optimizer terminated with a(n) {0} status (code {1}).".format(status_msg, status_code))

    except MdoError as e:
        print("Received Mindopt exception.")
        print(" - Code          : {}".format(e.code))
        print(" - Reason        : {}".format(e.message))
    except Exception as e:
        print("Received exception.")
        print(" - Reason        : {}".format(e))
    finally:
        # Step 5. Free the model.
        model.free_mdl()
    

运行代码后结果如下:

Start license validation (current time : 01-MAR-2023 21:00:37).
License validation terminated. Time : 0.002s

LP model is established.

Model summary.
 - Num. variables     : 15700
 - Num. constraints   : 1000
 - Num. nonzeros      : 556788
 - Bound range        : [1.0e+00,1.0e+00]
 - Objective range    : [5.0e-01,1.0e+00]
 - Matrix range       : [2.0e-03,1.0e+00]

Presolver started.
Presolver terminated. Time : 0.089s

Simplex method started.

    Iteration       Objective       Dual Inf.     Primal Inf.     Time
            0     0.00000e+00      2.7794e+11      2.4000e+01     0.11s    
            3     1.69224e+00      6.9867e+00      0.0000e+00     0.12s    CG pass 1
           11     1.27594e+00      2.7885e+00      0.0000e+00     0.12s    CG pass 2
End of column generation.
            0     0.00000e+00      2.5246e+11      3.2000e+01     0.12s    optimizing a block (26.5%)
           41     1.94879e+00      0.0000e+00      0.0000e+00     0.12s    
            0     0.00000e+00      2.1551e+11      2.2000e+01     0.12s    
            4     2.23388e+00      3.8777e+00      0.0000e+00     0.12s    CG pass 1
            8     1.98044e+00      2.0357e+01      0.0000e+00     0.12s    CG pass 2
End of column generation.
            0     0.00000e+00      2.1533e+11      2.2000e+01     0.12s    
            3     2.79271e+00      1.0703e+01      0.0000e+00     0.12s    CG pass 1
            7     2.11345e+00      3.4990e+01      0.0000e+00     0.12s    CG pass 2
End of column generation.
Model fingerprint: ==gZ3ZWYhRmZ3Z2bkV2dndmZ
Postsolver started.
Simplex method terminated. Time : 0.018s

Optimizer summary.
 - Optimizer used     : Simplex method
 - Optimizer status   : OPTIMAL
 - Total time         : 0.129s

Solution summary.       Primal solution
 - Objective          : 6.4074250003e+00 
----

The solver terminated with an OPTIMAL status (code 1).
目标函数最优取值是: 6.4074250003085975
 - 原始解 : 6.4074250003085975
 - 对偶解 : 6.407425000308594
 - 求解耗时 : 0.129049877 sec.
变量太多,请打开结果文件./model/LP_6_svm.sol来查看变量取值

方法2:命令行直接运行.py文件


上面是直接在cell中运行所有的脚本,我们也可以建立个新文档,将Python代码存在src/python_src文件夹的LP_6_svm.py文件(方法一中的源代码),需要注意文件的相对目录变化。然后在Launcher中打开Terminal,执行python xx.py文件来运行。


您也可以下载本.py文件,在自己的电脑上安装MindOpt求解器,然后在自己电脑的环境运行。


Luancher可以点击左上角的+打方块打开,Terminal在最下方,如截图示意。打开的窗口可以拖动调整位置。

image.png

然后在Terminal命令行里运行如下指令:


cd src/python_src
python LP_6_svm.py


运行得到的结果,同方法1:

image.png

求解结果


目标函数最优取值是: 6.4074250003085975。 解文件存在src/model/LP_6_svm.sol

联系我们

钉钉:y7r_yr2crky16

邮箱地址:solver.damo@list.alibaba-inc.com

相关文章
|
7月前
|
达摩院 开发者 容器
「达摩院MindOpt」优化形状切割问题(MILP)
在制造业,高效地利用材料不仅是节约成本的重要环节,也是可持续发展的关键因素。无论是在金属加工、家具制造还是纺织品生产中,原材料的有效利用都直接影响了整体效率和环境影响。
「达摩院MindOpt」优化形状切割问题(MILP)
|
7月前
|
人工智能 自然语言处理 达摩院
MindOpt 云上建模求解平台:多求解器协同优化
数学规划是一种数学优化方法,主要是寻找变量的取值在特定的约束情况下,使我们的决策目标得到一个最大或者最小值的决策。
|
2月前
|
机器学习/深度学习 算法 数据可视化
如果你的PyTorch优化器效果欠佳,试试这4种深度学习中的高级优化技术吧
在深度学习领域,优化器的选择对模型性能至关重要。尽管PyTorch中的标准优化器如SGD、Adam和AdamW被广泛应用,但在某些复杂优化问题中,这些方法未必是最优选择。本文介绍了四种高级优化技术:序列最小二乘规划(SLSQP)、粒子群优化(PSO)、协方差矩阵自适应进化策略(CMA-ES)和模拟退火(SA)。这些方法具备无梯度优化、仅需前向传播及全局优化能力等优点,尤其适合非可微操作和参数数量较少的情况。通过实验对比发现,对于特定问题,非传统优化方法可能比标准梯度下降算法表现更好。文章详细描述了这些优化技术的实现过程及结果分析,并提出了未来的研究方向。
33 1
|
5月前
|
人工智能 算法 调度
优化问题之如何选择合适的优化求解器
优化问题之如何选择合适的优化求解器
|
5月前
|
调度 决策智能
优化问题之优化求解器有哪些主要的评估特性
优化问题之优化求解器有哪些主要的评估特性
|
达摩院 调度
使用达摩院MindOpt优化交通调度_最大化通行量—线性规划问题
在数学规划中,网络流问题是指一类基于网络模型的流量分配问题。网络流问题的目标是在网络中分配资源,使得网络的流量满足一定的限制条件,并且使得某些目标函数最小或最大化。网络流问题通常涉及一个有向图,图中每个节点表示一个资源,每条边表示资源之间的关系。边上有一个容量值,表示该边上最多可以流动的资源数量。流量从源节点开始流出,经过一系列中间节点,最终到达汇节点。在这个过程中,需要遵守一定的流量守恒和容量限制条件。
|
7月前
|
存储 达摩院 调度
「达摩院MindOpt」优化FlowShop流水线作业排班问题
在企业在面临大量多样化的生产任务时,如何合理地安排流水线作业以提高生产效率及确保交货期成为了一个重要的问题。
「达摩院MindOpt」优化FlowShop流水线作业排班问题
MindOpt V1.0优化种植计划问题,新的建模方法
种植计划是指农业生产中针对不同农作物的种植时间、面积和种植方式等方面的规划安排。根据具体情况进行合理的规划和安排,以实现农作物的高产、优质和可持续发展。
MindOpt V1.0优化种植计划问题,新的建模方法
|
7月前
|
达摩院 自然语言处理 Java
MindOpt APL:一款适合优化问题数学建模的编程语言
本文将以阿里达摩院研发的MindOpt建模语言(MindOpt Algebra Programming Language, MindOptAPL,简称为MAPL)来讲解。MAPL是一种高效且通用的代数建模语言,当前主要用于数学规划问题的建模,并支持调用多种求解器求解。
|
达摩院 供应链 JavaScript
网络流:优化仓储物流调度问题-达摩院MindOpt
仓储物流调度是指在物流供应链中,对仓储和运输(运输路线、成本)进行协调和安排的过程。主要包含物流计划、运输调度、运发管理、库存管理等重要环节。随着网络、电商行业的迅速发展,仓储物流调度对于企业来说也非常重要,优秀的调度方案可以帮助降低库存成本、物流配送的效率、成本等等等,从而给企业带来降本增效。
网络流:优化仓储物流调度问题-达摩院MindOpt