【数据挖掘】分类之Naïve Bayes(转载)

【数据挖掘】分类之Naïve Bayes

1.算法简介

朴素贝叶斯(Naive Bayes)是监督学习的一种常用算法,易于实现,没有迭代,并有坚实的数学理论(即贝叶斯定理)作为支撑。

 

本文以拼写检查作为例子,讲解Naive Bayes分类器是如何实现的。对于用户输入的一个单词(words),拼写检查试图推断出最有可能的那个正确单词(correct)。当然,输入的单词有可能本身就是正确的。比如,输入的单词thew,用户有可能是想输入the,也有可能是想输入thaw。为了解决这个问题,Naive Bayes分类器采用了后验概率P(c|w)来解决这个问题。P(c|w)表示在发生了w的情况下推断出c的概率。为了找出最有可能c,应找出有最大值的P(c|w),即求解问题

argmaxc P(c|w)

 

根据贝叶斯定理,

P(c|w)=P(w|c) P(c) / P(w)

 

对于任意的c,P(w)均相等,问题等价与

argmaxc P(w|c) P(c)

 

P(w|c)表示的是用户输入w而是想输入c的概率。为了得到P(c),我们可以从文本库中统计c出现的频率。但是,P(w|c)似乎计算起来不那么容易。Norvig [1]中给出了一个简化计算办法:

(1)如果w拼写正确并且出现在文本库中,返回w;

(2)如果(1)没发生,计算与w的编辑距离为1的所有候选c,选出文本库中出现频率最高者;

(3)如果(1)(2)均没发生,计算与w的编辑距离为2的所有候选c,选出文本库中出现频率最高者;

(4)如果(1)(2)(3)均没发生,返回w。

一个单词通过删除、交换、更改、插入四个操作中一种,变换成另一个单词,这两个单词之间的编辑距离为1。

import re, collections  
  
def words(text): return re.findall('[a-z]+', text.lower())   
  
def train(features):  
    model=collections.defaultdict(lambda: 1)  
    for f in features:  
        model[f] += 1  
    return model  
  
NWORDS = train(words(file('big.txt').read()))  
  
alphabet = 'abcdefghijklmnopqrstuvwxyz'  
  
def edits1(word):  
    splits=[(word[:i], word[i:]) for i in range(len(word) + 1)]  
    deletes=[a + b[1:] for a, b in splits if b]  
    transposes=[a + b[1] + b[0] + b[2:] for a, b in splits if len(b)>1]  
    replaces=[a + c + b[1:] for a, b in splits for c in alphabet if b]  
    inserts=[a + c + b  for a, b in splits for c in alphabet]  
    return set(deletes + transposes + replaces + inserts)  
  
def known_edits2(word):  
    return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)  
  
def known(words): return set(w for w in words if w in NWORDS)  
  
def correct(word):  
    candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]  
    return max(candidates, key=NWORDS.get)  

2.Referrence

[1] Peter Norvig, How to Write a Spelling Corrector.

[2] 阮一峰, 贝叶斯推断及其互联网应用(三):拼写检查.

转载于:https://www.cnblogs.com/Vae1990Silence/p/7326422.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用Python编写的一个Naïve Bayes算法分类器的示例: ```python import numpy as np class NaiveBayes: def __init__(self): self.prior = None self.likelihood = None self.classes = None def fit(self, X, y): self.classes = np.unique(y) n_classes = len(self.classes) n_features = X.shape[1] self.prior = np.zeros(n_classes) self.likelihood = np.zeros((n_classes, n_features)) for i, c in enumerate(self.classes): X_c = X[c == y] self.prior[i] = X_c.shape[0] / X.shape[0] self.likelihood[i, :] = X_c.sum(axis=0) / X_c.sum() def predict(self, X): y_pred = [] for x in X: posteriors = [] for i, c in enumerate(self.classes): prior = np.log(self.prior[i]) likelihood = np.sum(np.log(self.likelihood[i, :]) * x) posterior = prior + likelihood posteriors.append(posterior) y_pred.append(self.classes[np.argmax(posteriors)]) return y_pred ``` 其中,`fit(X, y)`方法用于训练分类器,`X`是训练集样本特征值,`y`是训练集样本标签。算法首先计算每个类别的先验概率,再计算每个特征在给定类别下的似然概率。这里使用了拉普拉斯平滑,避免了在分类时遇到新特征值导致概率为0的问题。最后,`predict(X)`方法用于预测新样本的标签,`X`是测试集样本特征值。算法会计算每个类别下的后验概率,然后选择具有最大后验概率的类别作为预测结果。 以下是一个使用上述分类器进行二分类的示例: ```python # 创建训练集和测试集 X_train = np.array([[1, 0], [1, 1], [0, 1], [0, 0]]) y_train = np.array([0, 0, 1, 1]) X_test = np.array([[1, 0], [0, 1]]) # 创建分类器 clf = NaiveBayes() # 训练分类器 clf.fit(X_train, y_train) # 预测测试集标签 y_pred = clf.predict(X_test) # 打印预测结果 print(y_pred) ``` 输出: ``` [0, 1] ``` 说明分类器将测试集中的2个样本分别归为了类别0和类别1。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值