【问题标题】:Attribute asset to minimize variance in R属性资产以最小化 R 中的差异
【发布时间】:2017-11-27 18:39:52
【问题描述】:

我有一个优化问题要解决。这是上下文:我有潜在的“屏幕”可以购买来播放广告。每个屏幕都有一个名为“grp”的值。问题是,我有不同的电影,我想做的是尽量减少每部电影的总 grp 差异。

我有一个限制:所有银幕都必须归属于一部电影。

这是可用屏幕列表的示例:

    date     channel    screen_id format grp
    <dttm>     <chr>        <chr>  <chr> <dbl>
1 2017-10-08 channel A      2142 *  45s  9.95
2 2017-10-08 channel A      2391 T  30s  1.43
3 2017-10-09 channel A      2320 S  20s  2.60
4 2017-10-09 channel A      2410 S  20s  1.03
5 2017-10-09 channel A      2430 S  20s  0.78
6 2017-10-10 channel A      1903 S  20s  2.70

我有三部不同的电影,我们称它们为c("film_A", "film_B", "film_C"),我想确保将每部电影的总 grp 差异降至最低。

预期输出(此处归因是随机的,因此未优化):

        date   channel screen_id format   grp   film
      <dttm>     <chr>     <chr>  <chr> <dbl>  <chr>
1 2017-10-08 channel A      2142 *  45s  9.95 film_a
2 2017-10-08 channel A      2391 T  30s  1.43 film_b
3 2017-10-09 channel A      2320 S  20s  2.60 film_c
4 2017-10-09 channel A      2410 S  20s  1.03 film_a
5 2017-10-09 channel A      2430 S  20s  0.78 film_b
6 2017-10-10 channel A      1903 S  20s  2.70 film_c

在这种情况下,每部电影的总 grp 差异很大:

    film grp_per_film
   <chr>        <dbl>
1 film_a        16.45
2 film_b         3.78
3 film_c         6.50

我试图最小化的是电影总 grp 的方差,而不是每部电影作为一个组的屏幕 grp 的方差。

我有点卡在这个上。我查看了 PortfoliAnalytics 包,但我无法将投资组合逻辑应用于此问题。

【问题讨论】:

  • 您的示例输入的期望结果是什么?
  • 嘿,谢谢,我已经更新了问题。
  • 所需结果不符合您的条件。 film_a 在 grp 9.95 和 1.03 中。两者之间的差异并未最小化。
  • 示例中的输出是随机的,我试图最小化的是每部电影的 grp 总和之间的差异。所以在这种情况下,电影 a 为 16.45 grp,电影 b 为 3.78,电影 c 为 6.5。电影之间的差异确实很大,这就是我试图最小化的。
  • 在编写代码之前,我建议先开发一个数学模型。考虑目标(最小化方差)、约束(预算约束、目标 grp)和决策变量(买什么)。只是最小化方差将产生不购买任何东西的最佳解决方案。

标签: r mathematical-optimization


【解决方案1】:

您可以使用kmeans 执行以下操作。基本上,kmeans 创建了 3 个 grp 集群。这确实会最小化集群之间的 grps 差异。

dt <- read.table(text="
date       channel       screen_id format grp
2017-10-08 'channel A'      '2142 '  45s  9.95
2017-10-08 'channel A'     '2391 T'  30s  1.43
2017-10-09 'channel A'      '2320 S'  20s  2.60
2017-10-09 'channel A'      '2410 S'  20s  1.03
2017-10-09 'channel A'      '2430 S'  20s  0.78
2017-10-10 'channel A'      '1903 S'  20s  2.702",header=TRUE, stringsAsFactors=FALSE)

dt$film <- kmeans(dt$grp,centers=3)$cluster

        date   channel screen_id format   grp film
1 2017-10-08 channel A     2142     45s 9.950    2
2 2017-10-08 channel A    2391 T    30s 1.430    1
3 2017-10-09 channel A    2320 S    20s 2.600    3
4 2017-10-09 channel A    2410 S    20s 1.030    1
5 2017-10-09 channel A    2430 S    20s 0.780    1
6 2017-10-10 channel A    1903 S    20s 2.702    3

如果您想使用data.table(按日期或周分组可能很有用),这会起作用:

library(data.table)
setDT(dt)
dt[,film:=kmeans(grp,centers=3)$cluster]

         date   channel screen_id format   grp film
1: 2017-10-08 channel A     2142     45s 9.950    2
2: 2017-10-08 channel A    2391 T    30s 1.430    1
3: 2017-10-09 channel A    2320 S    20s 2.600    3
4: 2017-10-09 channel A    2410 S    20s 1.030    1
5: 2017-10-09 channel A    2430 S    20s 0.780    1
6: 2017-10-10 channel A    1903 S    20s 2.702    3

【讨论】:

  • 这是一种非常优雅的方式来限制每部电影的所有屏幕中的 grp 差异。但是我要最小化的是每部电影之间grp之和的差异。我将编辑我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2015-05-04
相关资源
最近更新 更多