如何使用python将对数概率转换为0到1之间的简单概率 [英] How to convert log probability into simple probability between 0 and 1 values using python
问题描述
我正在使用高斯混合模型进行说话人识别.我使用此代码来预测每个语音剪辑的说话者.
I am using Gaussian mixture model for speaker identification. I use this code to predict the speaker for each voice clip.
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])
它给了我这样的输出:
[ 311.79769716 0. 0. 0. 0. ]
[ 311.79769716 -5692.56559902 0. 0. 0. ]
[ 311.79769716 -5692.56559902 -6170.21460788 0. 0. ]
[ 311.79769716 -5692.56559902 -6170.21460788 -6736.73192695 0. ]
[ 311.79769716 -5692.56559902 -6170.21460788 -6736.73192695 -6753.00196447]
detected as - bart
这里的得分功能为我提供了每个说话者的对数概率.现在,我想确定阈值,为此,我需要将这些对数概率值转换为简单概率值(0到1之间).我怎样才能做到这一点?我正在使用python软件.
Here score function gives me the log probability for each speaker. Now i want to decide threshold value, for that i need these log probability value into simple probability value (between 0 to 1). How can i do that? I am using python software.
推荐答案
您必须采用指数(对数是幂的倒数: e log( p) = p ,其中p
是概率.
You have to take exponent (np.exp()
) of the log probabilities to get the actual probabilities back. It's because logarithm is the inverse of exponentiation: elog(p) = p, where p
are the probabilities.
下面是一个示例:
# some input array
In [9]: a
Out[9]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# converting to probabilities using "softmax"
In [10]: probs = np.exp(a) / (np.exp(a)).sum()
# sanity check
In [11]: probs.sum()
Out[11]: 1.0
# obtaining 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])
# In most cases, it 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() # check passed
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])
这篇关于如何使用python将对数概率转换为0到1之间的简单概率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!