我正在研究一个脚本,它是这样的:程序分析一些文本文件在一定的语言,绘制每个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