zoukankan      html  css  js  c++  java
  • 实验三 朴素贝叶斯算法及应用

    名称
    内容
    博客班级 班级链接
    作业要求 作业链接
    学号 3180701111

    一.实验目的

    1.理解朴素贝叶斯算法原理,掌握朴素贝叶斯算法框架;

    2.掌握常见的高斯模型,多项式模型和伯努利模型;

    3.能根据不同的数据类型,选择不同的概率模型实现朴素贝叶斯算法;

    4.针对特定应用场景及数据,能应用朴素贝叶斯解决实际问题。

    二.实验内容

    1.实现高斯朴素贝叶斯算法。

    2.熟悉sklearn库中的朴素贝叶斯算法;

    3.针对iris数据集,应用sklearn的朴素贝叶斯算法进行类别预测。

    4.针对iris数据集,利用自编朴素贝叶斯算法进行类别预测。

    三.实验报告要求

    1.对照实验内容,撰写实验过程、算法及测试结果;

    2.代码规范化:命名规则、注释;

    3.分析核心算法的复杂度;

    4.查阅文献,讨论各种朴素贝叶斯算法的应用场景;

    5.讨论朴素贝叶斯算法的优缺点。

    四.实验过程及结果

    实验代码及截图
    1.

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    
    from collections import Counter
    import math
    

    # data
    def create_data():
        iris = load_iris()
        df = pd.DataFrame(iris.data, columns=iris.feature_names)
        df['label'] = iris.target
        df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
        data = np.array(df.iloc[:100, :])
        # print(data)
        return data[:,:-1], data[:,-1]
    

    X, y = create_data()
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
    

    X_test[0], y_test[0]
    

    class NaiveBayes:
        def __init__(self):
            self.model = None
    
        # 数学期望
        @staticmethod
        def mean(X):
            return sum(X) / float(len(X))
    
        # 标准差(方差)
        def stdev(self, X):
            avg = self.mean(X)
            return math.sqrt(sum([pow(x-avg, 2) for x in X]) / float(len(X)))
    
        # 概率密度函数
        def gaussian_probability(self, x, mean, stdev):
            exponent = math.exp(-(math.pow(x-mean,2)/(2*math.pow(stdev,2))))
            return (1 / (math.sqrt(2*math.pi) * stdev)) * exponent
    
        # 处理X_train
        def summarize(self, train_data):
            summaries = [(self.mean(i), self.stdev(i)) for i in zip(*train_data)]
            return summaries
    
        # 分类别求出数学期望和标准差
        def fit(self, X, y):
            labels = list(set(y))
            data = {label:[] for label in labels}
            for f, label in zip(X, y):
                data[label].append(f)
            self.model = {label: self.summarize(value) for label, value in data.items()}
            return 'gaussianNB train done!'
    
        # 计算概率
        def calculate_probabilities(self, input_data):
            # summaries:{0.0: [(5.0, 0.37),(3.42, 0.40)], 1.0: [(5.8, 0.449),(2.7, 0.27)]}
            # input_data:[1.1, 2.2]
            probabilities = {}
            for label, value in self.model.items():
                probabilities[label] = 1
                for i in range(len(value)):
                    mean, stdev = value[i]
                    probabilities[label] *= self.gaussian_probability(input_data[i], mean, stdev)
            return probabilities
    
        # 类别
        def predict(self, X_test):
            # {0.0: 2.9680340789325763e-27, 1.0: 3.5749783019849535e-26}
            label = sorted(self.calculate_probabilities(X_test).items(), key=lambda x: x[-1])[-1][0]
            return label
    
        def score(self, X_test, y_test):
            right = 0
            for X, y in zip(X_test, y_test):
                label = self.predict(X)
                if label == y:
                    right += 1
    
            return right / float(len(X_test))
    


    model = NaiveBayes()
    

    model.fit(X_train, y_train)
    

    print(model.predict([4.4,  3.2,  1.3,  0.2]))
    

    model.score(X_test, y_test)
    

    from sklearn.naive_bayes import GaussianNB
    

    clf = GaussianNB()
    clf.fit(X_train, y_train)
    

    clf.score(X_test, y_test)
    

    clf.predict([[4.4, 3.2, 1.3, 0.2]])
    

    from sklearn.naive_bayes import BernoulliNB, MultinomialNB # 伯努利模型和多项式模型
    

    五.实验小结

    1、朴素贝叶斯的应用场景

    需要一个比较容易解释,而且不同维度之间相关性较小的模型的时候。
    可以高效处理高维数据,虽然结果可能不尽如人意。

    2、讨论朴素贝叶斯算法的优缺点

    优点

    1. 朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率;
    2. 对大数量训练和查询时具有较高的速度。即使使用超大规模的训练集,针对每个项目通常也只会有相对较少的特征数,并且对项目的训练和分类也仅仅是特征概率的数学运算而已;
    3. 对小规模的数据表现很好,能个处理多分类任务,适合增量式训练(即可以实时的对新增的样本进行训练);
    4. 对缺失数据不太敏感,算法也比较简单,常用于文本分类;
    5. 朴素贝叶斯对结果解释容易理解。
      缺点
    6. 需要计算先验概率;
    7. 分类决策存在错误率;
    8. 对输入数据的表达形式很敏感;
    9. 由于使用了样本属性独立性的假设,所以如果样本属性有关联时其效果不好。
  • 相关阅读:
    Samba 4.0 RC3 发布
    SymmetricDS 3.1.7 发布,数据同步和复制
    Express.js 3.0 发布,Node.js 的高性能封装
    GIFLIB 5.0.1 发布,C语言的GIF处理库
    jQuery UI 1.9.1 发布
    SVN Access Manager 0.5.5.14 发布 SVN 管理工具
    DynamicReports 3.0.3 发布 Java 报表工具
    HttpComponents HttpClient 4.2.2 GA 发布
    AppCan 2.0 正式发布,推移动应用云服务
    Ruby 2.0 的新功能已经冻结
  • 原文地址:https://www.cnblogs.com/alesoso/p/14929960.html
Copyright © 2011-2022 走看看