1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        溫州大學(xué)《機器學(xué)習(xí)》課程代碼(四)樸素貝葉斯

        共 7473字,需瀏覽 15分鐘

         ·

        2021-04-13 11:42

        機器學(xué)習(xí)練習(xí)4 樸素貝葉斯

        代碼修改并注釋:黃海廣,[email protected]

        代碼下載:

        https://github.com/fengdu78/WZU-machine-learning-course

        1.樸素貝葉斯法是典型的生成學(xué)習(xí)方法。生成方法由訓(xùn)練數(shù)據(jù)學(xué)習(xí)聯(lián)合概率分布,然后求得后驗概率分布。具體來說,利用訓(xùn)練數(shù)據(jù)學(xué)習(xí)的估計,得到聯(lián)合概率分布:

        概率估計方法可以是極大似然估計或貝葉斯估計。

        2.樸素貝葉斯法的基本假設(shè)是條件獨立性,

        這是一個較強的假設(shè)。由于這一假設(shè),模型包含的條件概率的數(shù)量大為減少,樸素貝葉斯法的學(xué)習(xí)與預(yù)測大為簡化。因而樸素貝葉斯法高效,且易于實現(xiàn)。其缺點是分類的性能不一定很高。

        3.樸素貝葉斯法利用貝葉斯定理與學(xué)到的聯(lián)合概率模型進(jìn)行分類預(yù)測。

        將輸入分到后驗概率最大的類。

        后驗概率最大等價于0-1損失函數(shù)時的期望風(fēng)險最小化。

        模型:

        • 高斯模型
        • 多項式模型
        • 伯努利模型
        import numpy as np
        import pandas as pd
        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]
        (array([5.1, 3.8, 1.9, 0.4]), 0.0)

        參考:https://machinelearningmastery.com/naive-bayes-classifier-scratch-python/

        GaussianNB 高斯樸素貝葉斯

        特征的可能性被假設(shè)為高斯

        概率密度函數(shù):

        數(shù)學(xué)期望(mean):

        方差:

        class NaiveBayes:
            def __init__(self):
                self.model = None

            # 數(shù)學(xué)期望
            @staticmethod
            def mean(X):
                return sum(X) / float(len(X))

            # 標(biāo)準(zhǔn)差(方差)
            def stdev(self, X):
                avg = self.mean(X)
                return math.sqrt(sum([pow(x - avg, 2for x in X]) / float(len(X)))

            # 概率密度函數(shù)
            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

            # 分類別求出數(shù)學(xué)期望和標(biāo)準(zhǔn)差
            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)
        'gaussianNB train done!'
        print(model.predict([4.4,  3.2,  1.3,  0.2]))
        0.0
        model.score(X_test, y_test)
        1.0

        scikit-learn實例

        from sklearn.naive_bayes import GaussianNB, BernoulliNB, MultinomialNB
        # 高斯模型、伯努利模型和多項式模型
        clf = GaussianNB()
        clf.fit(X_train, y_train)
        GaussianNB(priors=None, var_smoothing=1e-09)
        clf.score(X_test, y_test)
        1.0
        clf.predict([[4.4,  3.2,  1.3,  0.2]])
        array([0.])

        參考

        • Prof. Andrew Ng. Machine Learning. Stanford University
        • 李航,《統(tǒng)計學(xué)習(xí)方法》,清華大學(xué)出版社


        瀏覽 64
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            岳的胸好大好白 | 亚洲成人无码影院 | 久久亚洲AV午夜福利精品一区 | 蜜桃狠狠色伊人亚洲综合网站 | 污在线视频 | 九七成人电影 | 夜夜嗨aⅴ免费视频 | 国产女人呻吟高潮抽搐声 | 91在线黄色视频 | 日韩精品无码专区 |