Biz de görebileceğiniz bu cevap Python en küçük sayıdır (sadece örneğin götürün) olduğu 5e-324
nedeniyle ieee754 ve donanım neden sıra diğer diller için de geçerlidir.
In [2]: np.nextafter(0, 1)
Out[2]: 5e-324
Ve bundan daha küçük herhangi bir şamandıra 0'a yol açacaktır.
In [3]: np.nextafter(0, 1)/2
Out[3]: 0.0
Ve Naif Bayes'in işlevini with discrete features and two classes
istediğiniz gibi görelim :
p ( S= 1 | w1, . . . wn) = p ( S= 1 ) ∏ni = 1p ( wben| S= 1 ) Σs = { 0 , 1 }p ( S= s ) ∏ni = 1p ( wben| S= s )
Bu işlevi, aşağıdaki basit bir NLP göreviyle başlatmama izin verin.
S= 1S= 0n = 5 , 000wbenp ( wben| S= 1 )1 - p ( wben| S= 1 )
In [1]: import numpy as np
In [2]: from sklearn.naive_bayes import BernoulliNB
# let's train our model with 200 samples
In [3]: X = np.random.randint(2, size=(200, 5000))
In [4]: y = np.random.randint(2, size=(200, 1)).ravel()
In [5]: clf = BernoulliNB()
In [6]: model = clf.fit(X, y)
p ( S= s ) ∏ni = 1p ( wben| S= s )p ( wben| S= 1 )1 - p ( wben| S= 1 )Π5000ben5 e- 3240 / 0
In [7]: (np.nextafter(0, 1)*2) / (np.nextafter(0, 1)*2)
Out[7]: 1.0
In [8]: (np.nextafter(0, 1)/2) / (np.nextafter(0, 1)/2)
/home/lerner/anaconda3/bin/ipython3:1: RuntimeWarning: invalid value encountered in double_scalars
#!/home/lerner/anaconda3/bin/python
Out[8]: nan
In [9]: l_cpt = model.feature_log_prob_
In [10]: x = np.random.randint(2, size=(1, 5000))
In [11]: cls_lp = model.class_log_prior_
In [12]: probs = np.where(x, np.exp(l_cpt[1]), 1-np.exp(l_cpt[1]))
In [13]: np.exp(cls_lp[1]) * np.prod(probs)
Out[14]: 0.0
p (S= 1 | w1, . . . wn)
Resmi uygulamayı sklearn'de görebiliyoruz :
jll = self._joint_log_likelihood(X)
# normalize by P(x) = P(f_1, ..., f_n)
log_prob_x = logsumexp(jll, axis=1)
return jll - np.atleast_2d(log_prob_x).T
Pay için olasılıkların ürününü log olabilirlik toplamına dönüştürdü ve payda için logsumexp'i scipy'de kullandı :
out = log(sum(exp(a - a_max), axis=0))
out += a_max
Σs = { 0 , 1 }ej l ls- m bir x _j l lgünlükΣs = { 0 , 1 }ej l ls- m bir x _ j l lm a x _ j l l + günlükΣs = { 0 , 1 }ej l ls- m bir x _ j l lm bir x _ j l l
Ve işte türetme:
günlükΣs = { 0 , 1 }ej lls=günlükΣs = { 0 , 1 }ej llsem a x _ j l l - m a x _ j l l= günlükem bir x _ j l l+ günlükΣs = { 0 , 1 }ej l ls- m bir x _ j l l= M bir x _ j l l + günlükΣs = { 0 , 1 }ej l ls- m bir x _ j l l
m bir x _ j l lbir _ m bir x
günlükp ( S= 1 | w1, . . . wn)
return jll - np.atleast_2d(log_prob_x).T
Umarım yardımcı olur.
Referans:
1. Bernoulli Naif Bayes Sınıflandırıcı
2. Naif Bayes ile Spam Filtreleme - Hangi Naif Bayes?