如何使用python将日志概率转换为0到1之间的简单概率

2024-10-01 17:26:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我用高斯混合模型来识别说话人。我用这个代码来预测每个语音剪辑的说话人。在

for path in file_paths:   
path = path.strip()   
print (path)
sr,audio = read(source + path)
vector   = extract_features(audio,sr)
#print(vector)
log_likelihood = np.zeros(len(models))
#print(len(log_likelihood))
for i in range(len(models)):
    gmm1   = models[i]  #checking with each model one by one
    #print(gmm1)
    scores = np.array(gmm1.score(vector)) 
    #print(scores)
    #print(len(scores))
    log_likelihood[i] = scores.sum()
    print(log_likelihood)
    winner = np.argmax(log_likelihood)
    #print(winner)
print ("\tdetected as - ", speakers[winner])

结果是这样的:

^{pr2}$

这里的分数函数给出了每个演讲者的对数概率。现在我要确定阈值,因为我需要将这些对数概率值转换成简单的概率值(介于0到1之间)。我怎么能做到呢?我使用的是python软件。在


Tags: pathinlogforlenmodelsnp概率
1条回答
网友
1楼 · 发布于 2024-10-01 17:26:39

你必须取对数概率的指数(^{})才能得到实际概率。下面是一个例子:

# some array
In [9]: a
Out[9]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])

# softmax
In [10]: probs = np.exp(a) / (np.exp(a)).sum()

In [11]: probs.sum()
Out[11]: 1.0

# log probabilities
In [12]: log_probs = np.log(probs)

In [13]: log_probs
Out[13]: 
array([-8.45855173, -7.45855173, -6.45855173, -5.45855173, -4.45855173,
       -3.45855173, -2.45855173, -1.45855173, -0.45855173])

# mostly, won't sum to 1.0
In [14]: log_probs.sum()
Out[14]: -40.126965551706405

# get the probabilities back
In [15]: probabilities = np.exp(log_probs)

In [16]: probabilities.sum()
Out[16]: 1.0

In [17]: probabilities
Out[17]: 
array([  2.12078996e-04,   5.76490482e-04,   1.56706360e-03,
         4.25972051e-03,   1.15791209e-02,   3.14753138e-02,
         8.55587737e-02,   2.32572860e-01,   6.32198578e-01])

相关问题 更多 >

    热门问题