python optimize_一种优化Python中"事物"的简单方法

在Python中使用线性编程解决预算优化问题

a9883741feaf423d83add5a180d1b4db

> Photo by NeONBRAND on Unsplash

为什么优化预算很重要? 它使我们能够控制广告支出,确定支出金额并最大程度地实现预期的结果(访问,点击等)。 例如,给定10,000美元的预算及其约束,我们能够确定每个营销渠道的最佳预算分配是什么,以便使结果最大化。 这样一来,我们就可以避免在单一渠道上过于拥挤,而无需将所有内容放到一个单一的篮子中,而是将其分散到效果最佳的渠道上。

质量预算优化策略可以显着提高搜索广告活动的效率,从而帮助广告商在激烈的在线营销竞争中取得成功。

什么是线性编程?

80b36b754ee649feaa79f9480e0dee4a

> Graphical solution of a linear programming problem by Mark Schulze in Linear Programming Optimizat

线性规划(LP)是获得最佳结果的最广泛使用的优化技术之一。 摘自David G. Luenberger的"线性和非线性编程"一书:

顾名思义,线性规划问题的特征是未知数的线性函数。 在未知数中,目标是线性的,而在未知数中,约束是线性等式或线性不等式。

似乎线性编程的普及主要在于分析的制定阶段而不是求解阶段,这是有充分理由的。 因此,对于我们今天要解决的问题,可以将其表达为:

预算约束限制要在三个不同频道(电视,广播,报纸)之间分配的总金额,预算约束的形式为x1 + x2 + x3≤B,其中B是预算。 电视的总支出应少于200美元,广播的总支出应少于500美元,报纸的总支出应少于500美元。 总预算上限为$ 1000。

除此之外,我们还应该找出问题的目标函数,在该函数中我们计划最大化或最小化我们的首选结果(点击,销售等)。

c2589d4f27a34086b3bca6375d8f0912

> Sample problem formulation for linear programming from the book Linear and Non-linear programming

我将使用Kaggle的开源广告数据集向您展示其工作原理!

实作

理想情况下,使用LP时,目标函数应凭借线性关系。

如果目标函数由于其固有的定义而并非纯粹是线性的,则将其定义为线性的通常要比确定其他函数形式并使其他函数相信更复杂的形式是最好的选择要容易得多。 因此,线性度由于其简单性而经常被选为简便的方法,或者在寻求通用性时被选为在类似问题中同样适用(或不适用)的唯一功能形式— David G.Luenberger

5363a6316a29410aa04ba4f685b1f5a5

> The Optimization Process by PuLP, 2009

建立预测模型

e99e5e8daca2490db1b0d314e5c6a795

> Dataframe

我们首先使用SK-Learn的线性回归建立多元线性回归模型。 该内核提供了一种验证线性回归是否可以用作线性回归的好方法,因为它受到几个假设的限制。

### SCIKIT-LEARN ###feature_cols = ['TV', 'Radio', 'Newspaper']X = df_advertising[feature_cols]y = df_advertising[["Sales"]]# instantiate and fitlr = LinearRegression()model = lr.fit(X, y)# print the coefficientsprint(SkLearn_result.intercept_)print(SkLearn_result.coef_)
1bfad8e4e9114e79ba85de140c28d57a

> Y-intercept and coefficients

我们可以从给定模型中获得y截距和系数。

b7f87c2596a24d368f53d361c25d26a7

> Accuracy of our model

在1.509的均方根误差下,我们的模型非常准确,根据上图,我们可以看到与实际值相比,它可以预测得相对较好。 有了适当的预测模型,我们现在可以朝建立线性规划的目标函数迈进。

使用LP进行优化

我们将使用一个名为PuLP的python软件包。 这是针对Python的优化程序包。 PuLP简单明了,易于使用!

prob = LpProblem("Ads Sales Problem", LpMaximize)

我们首先使用LpProblem函数定义问题,在此我们要最大化输出,因此" LpMaximize"将成为参数。 然后,我们将指定约束条件,例如应为给定渠道支出多少预算。

#TV <= 200x = LpVariable("x", 0, 200)#Radio <= 500y = LpVariable("y", 0, 500)]#Newspaper <= 500z = LpVariable("z", 0, 500)#Should be less than $1000prob += x + y + z <= 1000

有了约束,我们现在可以使用模型给出的系数来构建目标函数:

d036958258034c9ba02ad85a86e1e4cc
coef = model.coef_prob += coef.item(0) * x + coef.item(1) * y + coef.item(2) * z + model.intercept_[0]

然后通过调用resolve()函数,它将为我们解决问题,我们还可以检查优化的状态。 通过打印,我们可以获得以下结果。

prob.solve()LpStatus[status]
0ac5fe08571940e1859cb3b91d1d8248

我们如何知道每个变量的最优值?

只需使用简单的for循环访问prob.variables,我们就能获得每个变量的最佳值以及下面的最大目标值。

for v in prob.variables(): print(v.name, "=", v.varValue)print("Objective = %f" % (prob.objective.value()))
5e8870c6bff54e149ef32ff81284db09

分析

现在,我们知道每个营销渠道应花费多少,我们绝对应该将其用作基线模型,以为下一次营销活动分配预算。 实际上,我们可以实现整个流程的自动化,在该流程中,每天可以为单个广告系列分配或优化预算。

结论

当线性规划可以应用于正确的用例时,它可以提供关键的管理见解,因此功能强大。 广告商通常将预算作为简单的约束条件,并付出了很多努力来寻找更有效的方式来进行各种市场所定义的可能的操作。 预算分配和调整的简单策略可以大大减少广告系列管理中有效点击/收入/销售方面的损失。

(本文翻译自George Wong的文章《A Simple Way to Optimize "Something" in Python》,参考:https://towardsdatascience.com/a-simple-way-to-optimize-something-in-python-740cda7fd3e0)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的粒子群优化算法的Python实现代码。请注意,这只是一个示例,可以根据特定问题进行修改。 ```python import random # 定义问题,目标函数为 x^2 def objective_function(x): return x ** 2 # 定义粒子类 class Particle: def __init__(self, dims): self.position = [random.uniform(-5.0, 5.0) for _ in range(dims)] self.velocity = [0.0 for _ in range(dims)] self.best_position = self.position self.best_score = float('inf') def update_velocity(self, global_best_position, omega, phi_p, phi_g): for i in range(len(self.velocity)): r_p = random.random() r_g = random.random() cognitive = phi_p * r_p * (self.best_position[i] - self.position[i]) social = phi_g * r_g * (global_best_position[i] - self.position[i]) self.velocity[i] = omega * self.velocity[i] + cognitive + social def update_position(self): for i in range(len(self.position)): self.position[i] += self.velocity[i] def evaluate(self): score = objective_function(self.position) if score < self.best_score: self.best_position = self.position self.best_score = score # 定义PSO算法类 class PSO: def __init__(self, dims, num_particles, max_iter): self.dims = dims self.num_particles = num_particles self.max_iter = max_iter self.particles = [Particle(dims) for _ in range(num_particles)] self.global_best_position = self.particles[0].position self.global_best_score = float('inf') def optimize(self): for i in range(self.max_iter): for particle in self.particles: particle.evaluate() if particle.best_score < self.global_best_score: self.global_best_position = particle.best_position self.global_best_score = particle.best_score for particle in self.particles: particle.update_velocity(self.global_best_position, 0.5, 0.5, 0.5) particle.update_position() # 使用示例 pso = PSO(1, 10, 100) pso.optimize() print(pso.global_best_position) ``` 这里我们定义了一个简单的目标函数 `objective_function`,它的实现是 $x^2$。然后我们定义了一个 `Particle` 类来表示粒子,其包括位置、速度、最佳位置和最佳得分。然后我们定义了一个 `PSO` 类来表示整个算法,其包括粒子群、最大迭代次数和全局最佳位置和最佳得分。 在 `optimize` 方法,我们首先遍历所有粒子并评估它们的得分。如果某个粒子的最佳得分比全局最佳得分更好,则更新全局最佳位置和最佳得分。然后我们再次遍历所有粒子,并更新它们的速度和位置。 最后,我们可以使用 `PSO` 类来解决特定问题。在这个示例,我们使用 `PSO(1, 10, 100)` 来寻找一个一维函数的最小值,其有10个粒子,最大迭代次数为100。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值