<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 7473字,需瀏覽 15分鐘

           ·

          2021-04-13 11:42

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

          代碼修改并注釋?zhuān)狐S海廣,[email protected]

          代碼下載:

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

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

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

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

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

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

          將輸入分到后驗(yàn)概率最大的類(lèi)。

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

          模型:

          • 高斯模型
          • 多項(xià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

              # 分類(lèi)別求出數(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!'

              # 計(jì)算概率
              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

              # 類(lèi)別
              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實(shí)例

          from sklearn.naive_bayes import GaussianNB, BernoulliNB, MultinomialNB
          # 高斯模型、伯努利模型和多項(xiàng)式模型
          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)計(jì)學(xué)習(xí)方法》,清華大學(xué)出版社


          瀏覽 64
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  爱液 视频网站 | 涩涩大香蕉| 北条麻妃视频在线观看 | 性做久久久久久久久 | 色老板在线观看永久 |