贝叶斯定理、拼写纠正、生日悖论
本周天气非常好。
一、贝叶斯定理
贝叶斯定理解决的是,在事件B已经发生的情况下,事件A发生的概率。
最重要的公式有两个:
贝叶斯公式
全概率公式
直观的解释就是,无论是事件B发生情况下,事件A发生,或者事件A发生情况下,事件B发生,其结果都是事件A和事件B同时发生了。反映到文氏图上,就是 A∩B 。
二、拼写纠正
拼写纠正是一个很常见的功能,比如把 config 拼写成 conf,软件提示输错了,并推荐正确写法。
1 | git conf |
the
tha
the
1 | 另外用于检查拼写的文件: |
package main
import (
“bufio”
“fmt”
“log”
“os”
)
var model = make(map[string]int)
var alphalet = “abcdefghijklmnopqrstuvwxyz”
//找到所有编辑距离为1的单词集合
func edit1(word string) []string {
s := make([]string, 1)
wordLen := len(word)
//add 1 word
for i := range word {
for _, c := range alphalet {
s = append(s, word[0:i]+string(c)+word[i:])
}
}
//delete 1 word
for i := range word {
s = append(s, word[0:i]+word[i+1:])
}
//change 1 word
for i := range word {
for _, c := range alphalet {
s = append(s, word[0:i]+string(c)+word[i+1:])
}
}
// change position
for i := range word[0 : wordLen-1] {
s = append(s, word[0:i]+string(word[i+1])+string(word[i])+word[i+2:])
}
return s
}
//计算所有的候选单词
func candidates(word string) []string {
s := make([]string, 1)
s = append(s, word)
s1 := append(s, edit1(word)…)
return s1
}
//计算最优解
func calc(word string) string {
words := candidates(word)
var maxProb = 1
var correctWord = word
for _, w := range words {
prob, prs := model[w]
if prs == true {
if prob > maxProb {
maxProb = prob
correctWord = w
}
}
}
return correctWord
}
func main() {
file, err := os.Open(“./words.txt”)
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
word := scanner.Text()
model[word]++
}
fmt.Println(calc("tae"))
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
1 | 当输入 `tha` 时,会自动纠正为 `the`。 |
package main
import “fmt”
import “time”
import “math/rand”
//return a random number of 1~365
func generateBirth() int{
rand.Seed(time.Now().UnixNano())
return 1+rand.Intn(364)
}
//check if at least 2 persons have same birthday
func checkSameBirthDay(num int) bool{
brithDays := make(map[int]int)
for i:=0;i<num;i++{
day := generateBirth()
brithDays[day]++
if(brithDays[day] >1){
return true
}
}
return false
}
func main(){
personNum := 50
loopNum := 10000
sameNum := 0
for i:=0;i<loopNum;i++{
if true == checkSameBirthDay(personNum){
sameNum++
}
}
fmt.Printf(“The probability of same birthday in %d persons is %f\n”,personNum,float64(sameNum)/float64(loopNum))
}
1 |
|
go run birthday.go
The probability of same birthday in 50 persons is 0.973000
与计算的值相差无几。
# 四、参考链接
[贝叶斯推断及其互联网应用(一):定理简介](http://www.ruanyifeng.com/blog/2011/08/bayesian_inference_part_one.html)
[哈希碰撞与生日攻击](http://www.ruanyifeng.com/blog/2018/09/hash-collision-and-birthday-attack.html)
[维基百科:生日问题](https://zh.wikipedia.org/wiki/%E7%94%9F%E6%97%A5%E5%95%8F%E9%A1%8C)
[
朴素贝叶斯案例2:拼写纠错(python实现)](https://blog.csdn.net/PbGc396Dwxjb77F2je/article/details/78786980)