如何在曲线下挑选积分?

时间:2013-01-29 02:14:33

标签: python dataset

我要做的是制作高斯函数图。然后在空格中的任何地方选择随机数,例如y = [0,1](因为它是标准化的)& X = [0200]。然后,我希望它忽略曲线上方的所有值,只保留它下面的值。

   import numpy
   import random
   import math
   import matplotlib.pyplot as plt
   import matplotlib.mlab as mlab
   from math import sqrt
   from numpy import zeros
   from numpy import numarray

   variance = input("Input variance of the star:")
   mean = input("Input mean of the star:")

   x=numpy.linspace(0,200,1000)
   sigma = sqrt(variance)

   z = max(mlab.normpdf(x,mean,sigma))
   foo = (mlab.normpdf(x,mean,sigma))/z
   plt.plot(x,foo)

   zing = random.random()
   random = random.uniform(0,200)

   import random

   def method2(size):
       ret = set()
       while len(ret) < size:
           ret.add((random.random(), random.uniform(0,200)))
       return ret

   size = input("Input number of simulations:")

   foos = set(foo)
   xx = set(x)

   method = method2(size)

   def undercurve(xx,foos,method):
       Upper = numpy.where(foos<(method))
       Lower = numpy.where(foos[Upper]>(method[Upper]))
       return (xx[Upper])[Lower],(foos[Upper])[Lower]

当我尝试打印undercurve时,我收到错误:

    TypeError: 'set' object has no attribute '__getitem__'

我不知道如何解决它。

大家都知道,我对python和编程都很陌生,但是对于任何帮助都表示赞赏,如果有任何问题,我会尽力回答。

2 个答案:

答案 0 :(得分:2)

您的代码难以阅读..无论如何,您无法使用[]访问某个集,即foos[Upper]method[Upper]等都是非法的。我不明白为什么要将foox转换成套装。此外,对于由method2生成的点,例如(x0,y0),x中很可能不存在x0。

我不熟悉numpy,但这就是我为你指定的目的所做的事情:

def undercurve(size):
    result = []
    for i in xrange(size):
        x = random()
        y = random()
        if y < scipy.stats.norm(0, 200).pdf(x): # here's the 'undercurve'
        result.append((x, y))
    return results

答案 1 :(得分:2)

你所看到的错误的直接原因可能是这一行(应该通过完整的追溯来识别 - 发布它通常很有帮助):

Lower = numpy.where(foos[Upper]>(method[Upper]))

因为容易混淆的变量method实际上是set,由函数method2返回。实际上,第二个想法,foos也是set,所以它可能首先失败了。集合不支持使用the_set[index]之类的索引进行索引;关于__getitem__的投诉意味着什么。

我不完全确定代码的所有部分是什么意思;像“foos”这样的变量名称实际上并没有那样的帮助。所以这就是我如何做你想做的事情:

# generate sample points
num_pts = 500
sample_xs = np.random.uniform(0, 200, size=num_pts)
sample_ys = np.random.uniform(0, 1, size=num_pts)

# define distribution
mean = 50
sigma = 10

# figure out "normalized" pdf vals at sample points
max_pdf = mlab.normpdf(mean, mean, sigma)
sample_pdf_vals = mlab.normpdf(sample_xs, mean, sigma) / max_pdf

# which ones are under the curve?
under_curve = sample_ys < sample_pdf_vals

# get pdf vals to plot
x = np.linspace(0, 200, 1000)
pdf_vals = mlab.normpdf(x, mean, sigma) / max_pdf

# plot the samples and the curve
colors = np.array(['cyan' if b else 'red' for b in under_curve])
scatter(sample_xs, sample_ys, c=colors)
plot(x, pdf_vals)

当然,您还应该意识到,如果您只想要曲线下的点,这相当于(但效率低得多)仅从正态分布中采样,然后为每个点随机选择y从0到pdf值均匀采样:

sample_xs = np.random.normal(mean, sigma, size=num_pts)
max_pdf = mlab.normpdf(mean, mean, sigma)
sample_pdf_vals = mlab.normpdf(sample_xs, mean, sigma) / max_pdf
sample_ys = np.array([np.random.uniform(0, pdf_val) for pdf_val in sample_pdf_vals])