NaiveBayesアルゴリズムとそのPython実装

アルゴリズム##

ベイズの定理##

ベイズの定理の公式は非常に単純です。

。多くの場合、分類の問題を解決するために使用されます。

プレーンベイズ##

中国語の名前の方が優れており、英語ではNaive Bayes、Naive Bayesと呼ばれます。Naiveの意味は誰もが知っています。NaiveBayesの単純さは、すべての属性(つまり機能)が相互に独立しているという仮定に反映されています。次のように表すことができます。

このことから、以前のベイズの定理は次のように表すことができます。

作る

最大のカテゴリーYはサンプルです

それが属するカテゴリー。

そして、各サンプルについて、

ラベルが付いていません

変更されたので、比較してください

それでおしまい

Pythonコードの実装##

'''
ナイーブベイズモデル
'''
import pandas as pd 
import numpy as np 
from sklearn.datasets import load_iris
from collections import defaultdict
from sklearn.cross_validation import train_test_split

def load_data():'''
 アイリスデータをロードする
    '''
 data =load_iris()return data['data'],data['target']classNBClassifier(object):
 def __init__(self):
  self.y =[]#ラベルコレクション
  self.x =[]#各属性の値のセット
  self.py =defaultdict(float)#ラベルの確率分布
  self.pxy =defaultdict(dict)#各ラベルの下の各属性の確率分布
  self.n =5#グレード数

 def prob(self,element,arr):'''
  要素がリストに表示される頻度を計算します
        '''
  prob =0.0for a in arr:if element == a:
    prob +=1/len(arr)if prob ==0.0:
   prob =0.001return prob

 def get_set(self,x,y):
  self.y =list(set(y))for i inrange(x.shape[1]):
   self.x.append(list(set(x[:,i])))#各列の値セットを記録します

 def fit(self,x,y):'''
  トレーニングモデル
        '''
  x = self.preprocess(x)
  self.get_set(x,y)
  #1. pを取得(y)for yi in self.y:
   self.py[yi]= self.prob(yi,y)
  #2. pを取得(x|y)for yi in self.y:for i inrange(x.shape[1]):
    sample = x[y==yi,i]#ラベルyiの下のサンプル
    # 列の確率分布を取得します
    pxy =[self.prob(xi,sample)for xi in self.x[i]]
    self.pxy[yi][i]= pxy
  print("train score",self.score(x,y))

 def predict_one(self,x):'''
  単一のサンプルを予測する
        '''
  max_prob =0.0
  max_yi = self.y[0]for yi in self.y:
   prob_y = self.py[yi]for i inrange(len(x)):
    prob_x_y = self.pxy[yi][i][self.x[i].index(x[i])]#p(xi|y)
    prob_y *= prob_x_y#pを計算する(x1|y)p(x2|y)...p(xn|y)p(y)if prob_y > max_prob:
    max_prob = prob_y
    max_yi = yi
  return max_yi

 def predict(self,samples):'''
  予測機能
        '''
  samples = self.preprocess(samples)
  y_list =[]for m inrange(samples.shape[0]):
   yi = self.predict_one(samples[m,:])
   y_list.append(yi)return np.array(y_list)

 def preprocess(self,x):'''
  さまざまな機能の値セットのサイズに大きな違いがあるため、確率行列の一部がまばらになり、データのセグメンテーションが必要になります
        '''
  for i inrange(x.shape[1]):
   x[:,i]= self.step(x[:,i],self.n)return x

 def step(self,arr,n):'''
  nレベルに分割
        '''
  ma =max(arr)
  mi =min(arr)for i inrange(len(arr)):for j inrange(n):
    a = mi +(ma-mi)*(j/n)
    b = mi +(ma-mi)*((j+1)/n)if arr[i]>= a and arr[i]<= b:
     arr[i]= j+1breakreturn arr

 def score(self,x,y):
  y_test = self.predict(x)
  score =0.0for i inrange(len(y)):if y_test[i]== y[i]:
    score +=1/len(y)return score

if __name__ =="__main__":
 x,y =load_data()
 x_train,x_test,y_train,y_test =train_test_split(x,y,test_size =0.5,random_state =100)
 clf =NBClassifier()
 clf.fit(x_train,y_train)
 score = clf.score(x_test,y_test)print('test score',score)

ソースコードアドレス:

Arctanxy/learning_notes

Recommended Posts

NaiveBayesアルゴリズムとそのPython実装
FMアルゴリズム分析とPython実装
最小二乗法とそのpython実装の詳細
Pythonのデータ構造とアルゴリズム
python勾配降下アルゴリズムの実装
Pythonの安らかなフレームワークインターフェイスの開発と実装
交差点のPython実装とIOUチュートリアル
Pythonの古典的なアルゴリズム
Python and Go
Pythonの内省と考察
[python] ubuntuの下のpython2とpython3
Pythonの分解とパッケージ化
Python3の構成とentry.md