【问题标题】:Search of interval optimization区间优化搜索
【发布时间】:2021-03-28 16:27:40
【问题描述】:

我的目标是使用给定的算法找到某个分布的概率密度函数。

这个算法要求我搜索一个浮点数放置在哪个区间。即使代码运行完美,它也需要很长时间。我一直在寻找优化代码的方法,但没有想到。

在每次迭代中,我检查浮点数是否在区间内:如果是这样,我希望在数组 p 中与我正在考虑的位置保持一致。

这是我的代码:

import numpy as np
import pylab as plt
import random as rd

n = [10,100,1000]
N = [10**6]
dy = 0.005
k_max = int(1/dy-1)
y = np.array([(j+0.5)*dy for j in range(k_max+1)])
intervals = np.linspace(0,1,k_max+2)

def p(y,n,N):

   p = np.zeros(len(y))

   Y = np.array([sum(np.array([rd.random() for k in range(n)]))/n for j in range(N)])
   z = np.array([sum(np.array([rd.random() for k in range(n)])) for l in range(N)])

   for j in Y:
       for i in range(len(y)-1):
           if intervals[i] <= j < intervals[i+1]:
               p[i] += 1

   return(p/(dy*N))

for a in n:
    pi = p(y,a,N[0])

    plt.plot(y,pi,label = 'n = ' + str(a))

plt.title('Probability Density Function')
plt.xlabel('x')
plt.ylabel('p(x)')
plt.show()

编辑:我已按要求添加了完整代码。 编辑 2: 修正了错误间隔。

【问题讨论】:

  • 什么是rd?如果您使用它来随机创建Yz,请使用numpy 的内置函数。
  • @Deep 我的坏!我将拥有其余的代码
  • 函数的调用不见了。
  • @Armali 调用并不重要。它返回它应该返回的东西。只有这部分没有优化。
  • @Armali 我很抱歉。我不小心复制了错误的代码。现在应该是正确的!

标签: python optimization micro-optimization


【解决方案1】:

可以在这里进行快速简单的优化:

   for j in Y:
       for i in range(len(y)-1):
           if intervals[i] <= j < intervals[i+1]:
               p[i] += 1

由于intervals由区间[0, 1]上的len(y)等间隔的数字组成,这也是Y值的范围,所以我们不需要搜索jintervals中的位置,而是我们可以计算它。

    for j in Y: p[int(j*(len(y)-1))] += 1

我们也可以删除未使用的

   z = np.array([sum(np.array([rd.random() for k in range(n)])) for l in range(N)])

剩余执行时间的大部分被占用

   Y = np.array([sum(np.array([rd.random() for k in range(n)]))/n for j in range(N)])

这里到np.array 的内部转换非常耗时;最好把它们都排除在外:

   Y = [sum([rd.random() for k in range(n)])/n for j in range(N)]

【讨论】:

  • 它似乎打破了简单的例子。令 $\Delta y = 0.5$。那么 $k_{max} = 1}$ 并且 y 会有 len = 2。假设 Y = [0.4,0.8],那么我们应该有 p = [1,1]。但是, int(j*(len(y)-1)) 在这两种情况下都会产生 0!
  • 在那张纸条上,我已经修复了我的代码,它没有将间隔除以正确的数量。
  • 关于您的简单示例:是的,这等于原始循环产生的结果,优化完全再现了它。如果它坏了,它从一开始就坏了。
  • 即使它坏了,我想我现在对如何解决这个问题有了更好的想法。非常感谢!
  • 是的,是的!但那是我的错误。我应该创建一个数组间隔 = [0,0.5,1]。
猜你喜欢
  • 1970-01-01
  • 2017-02-15
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 2021-08-30
  • 2014-01-10
  • 2011-05-14
相关资源
最近更新 更多