2013-07-16 71 views
3

我在創建python中的連續分配時遇到了困難,它真的開始困擾着我。我已閱讀並重新閱讀this python guide (scipy guide),它並未幫助我解決問題。在python中創建連續分配

我的代碼如下:

import sys 
import scipy.stats 
import numpy 


def CDF_Random(N,NE,E,SE,S,SW,W,NW,Iterations): 
    WindDir = [0,45,90,135,180,225,270,315] 
    Freq = N,NE,E,SE,S,SW,W,NW 

    mydist = scipy.stats.rv_continuous(#My problem is what to write here) 

    cdf_rand=mydist.rvs(size=Iterations)  
    return (cdf_rand) 

if __name__ == '__main__': 
    N = float(sys.argv[1]) 
    NE = float(sys.argv[2]) 
    E = float(sys.argv[3]) 
    SE = float(sys.argv[4]) 
    S = float(sys.argv[5]) 
    SW = float(sys.argv[6]) 
    W = float(sys.argv[7]) 
    NW = float(sys.argv[8]) 
    Iterations = float(sys.argv[9]) 
    numpy.set_printoptions(threshold=Iterations) 
    sys.stdout.write(str(CDF_Random(N,NE,E,SE,S,SW,W,NW,Iterations))) 

至於如果你讀的代碼,你可以看到,我的問題是知道要放什麼東西在括號創建連續分佈。 scipy.stats.rv_continuous(#what to put here)

我已經嘗試了很多不同的東西,主要是在this document(scipy guide)建議的人,像我的設置上下範圍值a=,b=其設置爲pdfppf。我已經嘗試使用在命令行中輸入的內容或僅寫入代碼本身的內容。

從命令行我運行這個命令 python C:\Users\...\CDF.py 0.01 0.01 0.01 0.01 0.01 0.93 0.01 0.01 10 每次我得到; RuntimeError:maximum recursion depth exceeded 我已經嘗試將遞歸深度重置爲不同的值,但這不起作用或崩潰python。 sys.setrecursionlimit(10000)

所以基本上應該在括號中輸入scipy.stats.rv_continuous()之後創建[array]稱爲WindDir連續分佈的規定分佈freq? 我通過谷歌和stackoverflow網站誠實地看了一眼,使用關鍵字搜索,單獨使用標籤和標籤進行搜索,並找不到解決方案。

編輯1 - 預期結果 我想輸出是0,3600,2pi

+0

什麼是每次迭代所需輸出的輸出?離散的主要風向,或範圍[0,360)內的實數?如果你想要一個真正的紅衣主教,試試'numpy.random.choice(list('NEWS'),size = 10,p = [0.1,0.1,0.1,0.7])' – mtadd

+0

我希望它能產生一個實數範圍'0,360'或'0,2pi',但使用列表不錯。 – user2519890

回答

1

好吧之間的實數,所以爲了使用rv_continuous你需要提供某種形式的概率密度函數。在下面的例子中,我實現了給定風向區間[0,360)的累積密度函數。我通過在輸入中指定的最近兩個風向之間插入概率密度函數來實現此目的。請注意0​​基類構造函數中指定的參數ab ...這些指定了考慮中的區間的最小值和最大值。試一試代碼,如果您有任何問題,請詢問,我會盡力幫助澄清。

編輯我修改了python 3的代碼,並且更新了cdf以更準確地在基本方向給出的頻率之間插值。

import scipy.stats 

class rvc(scipy.stats.rv_continuous): 
    def __init__(self, freqs): 
     super().__init__(a=0,b=359.9999) 
     self.WindDir = [0.,45.,90.,135.,180.,225.,270.,315.,360.] 
     self.Freqs = freqs 

    def _cdf(self, x): 
     return [self.do_cdf(i) for i in x] 

    def do_cdf(self, x): 
     if x < 0: return 0.0 
     if x >= 360: return 1.0 
     v = 0.0 
     for i in range(9): 
      if x >= self.WindDir[i]: 
       v += self.Freqs[i] 
      else: 
       v += (self.Freqs[i]-self.Freqs[i-1])*(x-self.WindDir[i-1])/45. 
       break 
     return v 

rv = rvc([0.01,0.01, 0.01, 0.01, 0.01, 0.01, 0.92, 0.01, 0.01]) 
print(rv.rvs(size=100)) 

運行此產生像

[ 305.76400244 271.49390379 285.5514374 280.4422151 302.52158889 
    273.85068415 278.8377575 287.05260894 270.66219523 301.97131911 
    277.77725392 293.29633122 273.60832876 278.90703722 271.12590324 
    288.38285244 299.89362412 276.68015144 278.46429959 304.33532312 
    313.42248626 272.10226608 311.00385667 284.48822492 298.134523 
    300.08266465 272.17850056 270.07995773 359.9999  289.13032076 
    206.58066169 308.95821915 288.998036 280.93451276 294.33703562 
    278.02828894 307.96335447 292.50172701 313.67335738 291.99562061 
    275.98551449 307.72620259 283.11307243 309.6052904 283.65619152 
    305.80365684 303.43088801 314.74811251 302.8390404 288.16580807 
    299.84487396 302.34636138 291.09465231 310.74393544 279.23446355 
    309.83353391 292.62761642 273.22324646 291.16193395 298.51520679 
    299.87754111 280.29779055 276.76741796 285.5186257 301.7074023 
    274.9771402 280.6619726 276.53202603 289.50757382 313.61213159 
    98.86469637 298.41091812 83.62474126 290.42538277 306.70218844 
    270.81939255 290.25089647 305.3277742 278.03965968 280.5979916 
    307.9492377 284.30184233 307.14788891 283.33779011 270.86398644 
    297.70610336 277.48672772 300.35147777 271.07308885 304.41450287 
    312.5640489 273.54296504 311.62527023 298.95246144 275.199183 
    302.6063864 359.9999  311.25861396 306.83491033 313.52858514] 
+0

我正在使用python 3.3,所以不得不作出一些調整,我不得不將'xrange'更改爲'range',因爲我不認爲'xrange'在3.3中被使用,因爲它在我嘗試運行代碼時返回了錯誤。另外,我不得不在周圍的項目,我想打印到屏幕'print(rv.rvs(size = 100))' – user2519890