贝叶斯分类实例

朴素贝叶斯与TAN算法解析
本文详细介绍了朴素贝叶斯算法及其在分类任务中的应用,并通过具体实例展示了如何进行分类预测。此外,还介绍了TAN算法,它是朴素贝叶斯的一种改进,能够通过发现属性间的依赖关系降低独立性假设。

(1) 朴素贝叶斯算法

  设每个数据样本用一个n维特征向量来描述n个属性的值,即:X={x1,x2,…,xn},假定有m个类,分别用C1, C2,…,Cm表示。给定一个未知的数据样本X(即没有类标号),若朴素贝叶斯分类法将未知的样本X分配给类Ci,则一定是

  P(Ci|X)>P(Cj|X) 1≤j≤m,j≠i

  根据贝叶斯定理

  由于P(X)对于所有类为常数,最大化后验概率P(Ci|X)可转化为最大化先验概率P(X|Ci)P(Ci)。如果训练数据集有许多属性和元组,计算P(X|Ci)的开销可能非常大,为此,通常假设各属性的取值互相独立,这样

  先验概率P(x1|Ci),P(x2|Ci),…,P(xn|Ci)可以从训练数据集求得。

  根据此方法,对一个未知类别的样本X,可以先分别计算出X属于每一个类别Ci的概率P(X|Ci)P(Ci),然后选择其中概率最大的类别作为其类别。

  朴素贝叶斯算法成立的前提是各属性之间互相独立。当数据集满足这种独立性假设时,分类的准确度较高,否则可能较低。另外,该算法没有分类规则输出。

  (2) TAN算法

  TAN算法通过发现属性对之间的依赖关系来降低NB中任意属性之间独立的假设。它是在NB网络结构的基础上增加属性对之间的关联(边)来实现的。

  实现方法是:用结点表示属性,用有向边表示属性之间的依赖关系,把类别属性作为根结点,其余所有属性都作为它的子节点。通常,用虚线代表NB所需的边,用实线代表新增的边。属性Ai与Aj之间的边意味着属性Ai对类别变量C的影响还取决于属性Aj的取值。

  这些增加的边需满足下列条件:类别变量没有双亲结点,每个属性有一个类别变量双亲结点和最多另外一个属性作为其双亲结点。

  找到这组关联边之后,就可以计算一组随机变量的联合概率分布如下:

  其中ΠAi代表的是Ai的双亲结点。由于在TAN算法中考虑了n个属性中(n-1)个两两属性之间的关联性,该算法对属性之间独立性的假设有了一定程度的降低,但是属性之间可能存

  在更多其它的关联性仍没有考虑,因此其适用范围仍然受到限制。

贝叶斯分类 实例

First Step

Find Classes:

      C1: buys_computer = ‘yes’

      C2: buys_computer = ‘no’

 

Second Step

      Find P(C1) and P(C2)

                      P( buys_computer = “yes”)  = 9/14 = 0.643

                      P( buys_computer = “no”) = 5/14= 0.357

 

Third Step

  Compute P (X|C) for each class :

     P (age = “Youth” / buys_computer = “yes”)  = 2/9 = 0.222

     P (age = “Youth” /  buys_computer = “no”) = 3/5 = 0.6

     P (income = “medium” /  buys_computer = “yes”) = 4/9 = 0.444

     P (income = “medium” /  buys_computer = “no”) = 2/5 = 0.4

     P (student = “yes” /  buys_computer = “yes) = 6/9 = 0.667

     P (student = “yes” /  buys_computer = “no”) = 1/5 = 0.2

     P (credit_rating = “fair” /  buys_computer = “yes”) = 6/9 = 0.667

     P (credit_rating = “fair” / buys_computer = “no”) = 2/5 = 0.4

 

Fourth Step .

    Find P(X|Ci) :

 For C1:    Multiply all the probabilities that belong to class “yes”

           P(X|buys_computer = “yes”) = 0.222 x 0.444 x 0.667 x 0.667=.044

Similarly     for “class = no”

          P(X|buys_computer = “no”) = 0.6 x 0.4 x 0.2 x 0.4 = 0.019

 

Finally ,

     find ……  P(X|Ci)*P(Ci) …….  for each class

P(X|buys_computer = “yes”) * P(buys_computer = “yes”) = 0.028

P(X|buys_computer = “no”) * P(buys_computer = “no”) = 0.007

 

参考:

http://www.cnblogs.com/phinecos/archive/2008/10/21/1315948.html

http://summerbell.iteye.com/blog/392459

http://blog.youkuaiyun.com/DL88250/archive/2008/02/20/2108164.aspx

http://www.cnblogs.com/waemz/archive/2009/02/25/1397647.html

 

 

### 朴素贝叶斯分类的示例代码 以下是基于 Python 的朴素贝叶斯分类器实现,该实现利用 `scikit-learn` 库完成: ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB from sklearn.metrics import accuracy_score # 加载鸢尾花数据集作为示例 data = load_iris() X, y = data.data, data.target # 将数据分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 创建高斯朴素贝叶斯分类实例 classifier = GaussianNB() # 训练模型 classifier.fit(X_train, y_train) # 对测试集进行预测 y_pred = classifier.predict(X_test) # 输出模型准确性 accuracy = accuracy_score(y_test, y_pred) print(f"Model Accuracy: {accuracy * 100:.2f}%") ``` 上述代码展示了如何使用 `GaussianNB` 来构建一个简单的朴素贝叶斯分类器,并评估其性能[^1]。 --- ### Java 实现的朴素贝叶斯分类器 以下是一个简化版的 Java 实现,涵盖了核心逻辑: ```java import java.util.*; public class NaiveBayesClassifier { private Map<String, Double> priorProbabilities; private Map<String, Map<Integer, Double>> conditionalProbabilities; public NaiveBayesClassifier() { this.priorProbabilities = new HashMap<>(); this.conditionalProbabilities = new HashMap<>(); } public void train(List<List<Object>> trainingData) { int totalSamples = trainingData.size(); Map<String, Integer> classCounts = new HashMap<>(); // 统计每种类别的数量并计算先验概率 for (List<Object> sample : trainingData) { String label = (String) sample.get(sample.size() - 1); classCounts.put(label, classCounts.getOrDefault(label, 0) + 1); } for (Map.Entry<String, Integer> entry : classCounts.entrySet()) { double probability = (double) entry.getValue() / totalSamples; priorProbabilities.put(entry.getKey(), probability); } // 初始化条件概率表 for (int i = 0; i < trainingData.get(0).size() - 1; i++) { conditionalProbabilities.put(String.valueOf(i), new HashMap<>()); } // 构建条件概率矩阵 for (List<Object> sample : trainingData) { String label = (String) sample.get(sample.size() - 1); for (int featureIndex = 0; featureIndex < sample.size() - 1; featureIndex++) { Object value = sample.get(featureIndex); String key = label + "," + value.toString(); Map<Integer, Double> map = conditionalProbabilities.get(String.valueOf(featureIndex)); map.put(Integer.parseInt(key), map.getOrDefault(Integer.parseInt(key), 0.0) + 1.0); } } } public String predict(List<Object> instance) { double maxProbability = Double.MIN_VALUE; String predictedClass = null; for (String className : priorProbabilities.keySet()) { double currentProbability = priorProbabilities.get(className); for (int i = 0; i < instance.size(); i++) { Object value = instance.get(i); String key = className + "," + value.toString(); Map<Integer, Double> map = conditionalProbabilities.get(String.valueOf(i)); if (map.containsKey(Integer.parseInt(key))) { currentProbability *= map.get(Integer.parseInt(key)) / priorProbabilities.get(className); } else { currentProbability *= 0.0001; // 防止零概率问题 } } if (currentProbability > maxProbability) { maxProbability = currentProbability; predictedClass = className; } } return predictedClass; } public static void main(String[] args) { List<List<Object>> dataset = Arrays.asList( Arrays.asList(1, "S", "L"), Arrays.asList(1, "M", "H"), Arrays.asList(1, "M", "H"), Arrays.asList(1, "S", "L"), Arrays.asList(0, "S", "L"), Arrays.asList(0, "M", "H"), Arrays.asList(0, "M", "H"), Arrays.asList(0, "L", "H"), Arrays.asList(0, "L", "H") ); NaiveBayesClassifier nb = new NaiveBayesClassifier(); nb.train(dataset); System.out.println(nb.predict(Arrays.asList(1, "S"))); // 测试样例 } } ``` 此代码片段提供了朴素贝叶斯分类器的一个基本框架,包括训练和预测方法[^2]。 --- ### MATLAB 中的朴素贝叶斯实战案例 MATLAB 提供了一个内置函数 `fitcnb`,用于创建朴素贝叶斯分类器。下面是一段简单示例: ```matlab % 导入数据 load fisheriris; meas = meas(:, 3:4); % 使用花瓣长度和宽度作为特征 species = species; % 种类标签 % 划分训练集和测试集 cv = cvpartition(species, 'HoldOut', 0.3); trainingSet = meas(cv.training, :); testSet = meas(cv.test, :); trainingLabels = species(cv.training); testLabels = species(cv.test); % 训练朴素贝叶斯分类器 nbModel = fitcnb(trainingSet, trainingLabels); % 预测测试集类别 predictedLabels = predict(nbModel, testSet); % 显示混淆矩阵 confusionMatrix = confusionchart(testLabels, predictedLabels); title('Confusion Matrix'); ``` 这段代码演示了如何加载数据、划分训练集与测试集、训练模型以及评估模型表现[^3]。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值