我正在研究一個腳本,它是這樣的:程序分析一些文本文件在一定的語言,繪製每個k的概率分佈,其中k是第一個字符出現在文本的每個字母中的每個給定字母的後面。然後該程序使用這些知識嘗試和使用馬爾可夫鏈書寫「真實」的單詞。概率分佈和浮點型變量,概率必須加1 1
我已經寫了大部分的腳本,它已經吐出了有趣的單詞,關鍵是生成單詞的函數正在嘗試和除了機制,以避免卡住。它被卡住了,因爲一些概率分佈不加到1(我猜是因爲float類型不是那麼精確或類似的東西),應該與這些分佈一起工作的numpy函數引發了一個ValueError,因爲概率不等於1
通過觸發某些發行版的例外情況,根本不會生成某些單詞,最終結果不如它可能的有趣。
現在,我的問題是:有沒有辦法讓這些概率分佈在生成時加起來爲1? 我試過gmpy2,round()函數,但似乎沒有人工作。也許這是一個愚蠢的問題,我只需要得到一些新鮮空氣...無論如何,一些幫助將是有用的!
這裏是概率分佈
def FreqRel(self,listValues):
absFreq = self.AbsFreq(listValues)
freqRel = []
for i in absFreq:
freqRel.append(i/sum(absFreq))
if sum(freqRel) != 1:
print("Frequencies do not add up to 1")
if sum(freqRel) - 1 < 0:
diff = sum(freqRel) - 1
#This should be an adjustment which should not interfere
#that much on the probability distribution
freqRel[1] = freqRel[1] - diff
print("missing",diff)
elif sum(freqRel) - 1 > 0:
diff = sum(freqRel) - 1
#This should be an adjustment which should not interfere
#that much on the probability distribution
freqRel[1] = freqRel[1] - diff
print("Too much",diff)
return freqRel
這裏產生的代碼是運行此功能時,我得到印在控制檯上的內容:
這裏是當總和不是1時崩潰的代碼。numpy行是崩潰的thos。 和錯誤是:ValueError異常:概率加起來還不到1
def spitText(n):
i = 0
while i < n:
try:
word = ""
#This oldChar setting is arbitrary, later I'm going to fix it
oldChar = "b"
for k in range(np.random.choice(distributions[0],replace=True,p=distributions[1])):
newChar = np.random.choice(alphabet,replace=True,p=distRel[alphabet.index(oldChar)])
word = word + newChar
oldChar = newChar
print(word)
time.sleep(0.2)
i+=1
except:
pass
你的freqAss是什麼?它起源於哪裏? – greole 2014-08-27 09:01:54
對不起,它應該是absFreq而不是freqAss。這是一個錯字。剛剛編輯,謝謝! – mickkk 2014-08-27 09:03:56
你能向我們展示當總和不是1時崩潰的代碼嗎? – parchment 2014-08-27 09:08:27