python的线性优化——你需要知道的有哪些?

python的线性优化——你需要知道的有哪些?

原文作者:KarthikeyanSankaran

原文链接:https://www.analyticsvidhya.com/blog/2017/10/linear-optimization-in-python/

翻译:叶雯寅

前言今日大数据科学与机器学习被各行各业广泛使用来解决不同的问题。为大数据科学与商业决策间建立有效的桥梁也成为了促进实现大数据在商业领域广泛运用进程的步骤之一。

大数据科学通常通过过数据的预测、规律与表现(通常没有约束的概念)的方式来呈现,但是对做商业情况中的决策是远远不够的。大数据科学的输出或呈现效果必须能够被商业决策所吸收并利用,同时,在商业情况下的优化模型需要有商业条件的约束。

例如在分析超市产业链案例的情况下 – 你的大数据处理过程需要来预测未来的销售数据。你将需要使用初始数据来建立一个优化库存与销售策略的模型。

目录介绍线性优化

提出问题-创建TED视频的观看列表

第一步- 导入相关包

第二步-为TED视频创建数据框

第三步- 建立线性优化问题

第四步- 将优化结果转化为可分析的形式

 

线性优化导论

在优化技术中,使用Simplex Methond被认为是最有效的方法之一。这种方法曾被评为20世纪十大最优算法之一。作为大数据科学领域的业内人士,了解怎么样在现实中实现线性优化是非常重要的。这篇文章将为大家详细呈现如果使用Python PuLP包来实现线性优化。

为了让问题变得更简单更有趣,我们将优化技术运用在日常生活的问题中。当然,我们学习的目的也是讲优化问题能够运用在多种商业问题中。

提示:本篇文章将假定读者有线性编程的基础知识。你可以复制以下网页链接回顾相关内容。

Introductory guide on Linear Programming for (aspiring) data scientists

                       
问题- 创建TED视频观看列表

TED是一个致力于分享各类优秀观点与想法的非营利性平台。在1984年,一个科技、娱乐与设计交融的年代,TED以一个大会的形式开始了它的生命历程。今天的TED用超过100种语言涵盖了几乎所有从科学到商业再到全球问题的话题。行业领袖与精英通过TED的平台为人们分享他们所在行业的有价值的信息与他们的经历。

现在,在根据观看量与视频量的条件里,你将创建一个最受欢迎的TED的视频列表。我们来看看如何用Python来建立一个最合理最优化的视频观看列表。

本篇文章的代码可以在此文中下载。Jupyter notebook的代码截图如下:

01
导入相关包

PuLP是Python中的开源软件,它将作为数学模型来描述优化问题。PuLP可以调用任意线性程序的求解程序(CBC,GLPK, CPLEX, Gurobi etc)来解决模型问题,然后我们可以运用Python的命令来处理并呈现结果。在初始状态下,PuLP附带CoinMP求解程序。

02
为TED视频创建数据框

首先将2550个TED视频的数据集从Kaggle中下载并读取到数据框中。并确保选中相关内容列的子集,数据将包括视频的序号,名称,TED相关活动的名称,视频的长度(分钟),视频的观看量。

03
建立线性优化问题

我们先从定义线性编程对象开始。

步骤:3.1:创建决策变量

对每一行数据进行迭代,通过创建决策变量来实现每一个视频内容成为一个变量。因为每一个视频将被选择或不被选择成为最终列表中的视频之一,所以这时候我们的决策变量就是二元变量。(1=被选择,0=不被选择)

步骤3.2:定义目标函数

在本案例中,我们的目标函数是每个视频浏览量的总和。视频流量起到了评估视频的受欢迎度的作用,所以选择最合适的视频(抉择变量)来取得浏览量(受欢迎程度)的最大值是十分重要的步骤之一。

步骤3.3:确定约束条件

在此问题中,我们有两个约束条件:

a)将被分配到观看列表的视频总时长是固定的。

b)视频列表中的视频数量将被限制,避免过多的信息。

步骤3.4:确定最终格式

问题形成最终的格式将写入.lp文件。此时目标函数将被列出,决策变量和限制条件将应用于问题中。

步骤 3.5:实际优化

实际优化中的将用到叫做‘prob.solve’的一行代码。插入断言语句来判断最佳结果是否符次问题的要求。

04
将优化结果转化为可分析的形式

指出具体被优化后的决策变量(视频)的优化结果必须被转换为播放列表的形式,具体代码如下:

结语本文章提供了在python下使用线性优化技术来解决日常问题的例子。当然这也可以被利用在更多有限制条件下的商业决策问题中。

每一位数据科学从业者需要学习优化技术来帮助解决商业问题,本篇文章来帮助你跨出第一步。