先來簡單介紹一下貝葉斯公式吧,然後再來說代碼實現。如果沒記錯的話,大家高中的時候應該就學過貝葉斯公式了。算了,還是從頭開始講吧,不然兩句話就介紹完了。我們都知道,事件A在事件B已經發生的條件下發生的概率為:
如果A和B是兩個相互獨立的事件,則有:
顯然,我們可以利用上面的公式來判斷兩個事件是否獨立。再來引入一下全概率公式(上標c代表補集):
上面的公式畫個維恩圖的話其實很好理解(圖源網絡):
綜合上面的結論,我們可以很容易地推出貝葉斯公式來:
實際應用到我們的姓名猜測性別中的話,其實就是求:
顯然,我們有:
這裡我們已知每個漢字在男性名字和女性名字中出現的頻率:
我們可以假設他們是獨立的,例如:
所以上面
def genderprob(name, probs, type_='male'): assert type_ in ['male', 'female'] if type_ == 'male': p = self.male_total / self.total for c in name: p *= probs.get(c, (0, 0))[0] else: p = self.female_total / self.total for c in name: p *= probs.get(c, (0, 0))[1] return p還是以劉亦菲為例:
P(女性) = 女性姓名出現的次數 / 總出現次數P(劉|女) = 劉在女性姓名中出現的次數 / 女性姓名出現的總次數
分母在做除法的時候可以約去,所以不用算,即:
male_prob = genderprob(name, self.name_probs, 'male')female_prob = genderprob(name, self.name_probs, 'female')result = {'male': male_prob / (male_prob + female_prob), 'female': female_prob / (male_prob + female_prob)}然後利用PyQt5給這個姓名預測性別的小模型做個簡單的可視化界面:
大功告成,完整原始碼詳見相關文件~