【发布时间】:2019-06-29 07:15:25
【问题描述】:
我遇到了一个我无法使用正常蛮力方法解决的问题。
问题-我试图找到一个 50 年的组合,一次取 30 年而不重复,这样它们的平均值和变异系数就在特定的范围内。
我正在使用itertools combinations。
但问题是,总组合中没有 -47129212243960 计算时间过长。
有什么方法可以提高效率吗?
数据集的格式如下-
Yrs Prs_90 Prs_80 Prs_70
2012 499.934588 521.512345 425.189729
2013 579.063531 477.782099 256.382494
2014 458.415624 456.480642 363.309507
我正在计算Prs_90 , Prs_80, Prs_70 的均值和变异系数,然后根据取决于均值和变异系数的阈值找到组合。
编辑-变异系数(CV)=标准偏差(x)/平均值(x)
选择所需组合的条件是-
if (mean >= 501 and <= 570) and ((0.13<=CV<=0.17) or(0.23<=CV<=0.27) or(0.23 <=CV <=27)
或
if (mean >= 451 and <= 460) and ((0.13<=CV<=0.17) or(0.23<=CV<=0.27)
or(0.33 <=CV <=37):
或
if (mean >= 391 and <= 400) and ((0.13<=CV<=0.17) or(0.23<=CV<=0.27)
or(0.33 <=CV <=37)):
我需要上面每个条件对应的组合。
编辑- 我首先以以下格式重新排序上面提供的数据框-
Yrs Prs_80 Prs_70
Prs_90
579.063531 2013 477.782099 256.382494
477.758138 2044 475.458614 259.228592
492.957830 2036 408.590138 281.921215
541.632294 2042 430.990568 290.163454
565.369062 2024 420.107058 296.545395
409.979527 2027 379.740246 301.086631
347.702470 2052 610.775045 307.756455
460.657276 2016 301.774467 309.311562
然后我使用以下方法-
r =30
check1 = 1
check10 = 1
for p in combinations(test4.index,r):
den = np.mean(p)
num = np.std(p)
cv = num/den
if (den >= 561 and den <= 570 ) :
if(cv>=0.13 or cv <= 0.17 and check1):
check1=0
print("Combination 1 done")
elif(den>=391 and den <= 400):
if(cv>=0.13 or cv < 0.17 and check10):
check10 = 0
print("Combination 10 done")
if(check1+check10==0)
break
即使这样,我在这里也只考虑了 2 个条件。它正在运行数百万次迭代,因此完整处理组合将需要更多时间。
我使用 check1 和 check10 作为信号,因为当我收到以下组合时,我会中断循环。
其他信息-
Prs_90 Prs_80 Prs_70
count 50.000000 50.000000 50.000000
mean 510.732700 445.366865 386.037076
std 113.773333 84.078209 80.987841
min 347.702470 233.335085 256.382494
25% 427.241363 390.745725 320.812298
50% 469.263029 439.407141 383.430153
75% 573.406731 512.019602 433.199140
max 854.819691 610.775045 644.588971
数据的CV为25%。
【问题讨论】:
-
你能说得更具体点吗? “变异系数”是什么意思?你能给出一个公式吗?你如何使用你的阈值(也请给出一个公式)?
-
对不起,我添加了细节。
-
您可以将您的 CV 不等式转换为 StdDev 不等式,然后测试它们的 StdDev 组合.....在所有 CV 和 Mean 都通过等式链接之后
-
问题不是我不能改造,问题是时间太长不知道怎么优化
-
你能再具体一点吗?例如:您的原始数据集看起来像熊猫数据框,对吗?你能提供一个minimal reproducible example 告诉我们你的问题应该如何解决吗?即使它不是大数据,我们也会考虑在内。
标签: python algorithm optimization combinations mathematical-optimization