S 1.1 機器學習-樸素貝葉斯與單層神經網路關係

本節中聊聊貝葉斯網路與單層神經網路的關係,有些人可能從書本上看到過一個說法就是高斯環境下的貝葉斯分類器在協方差矩陣相同的情況下那麼他所對應的就是一個線性分類問題。如果本文也這樣把這個結論複述一遍就沒有意義了。所以從頭聊聊這個問題。

貝葉斯分類器的loss函數

任何機器學習演算法都會有一個損失函數,可能也叫代價函數,百度上都在陳述演算法過程,但是我看很少有提到這個loss函數的。本文為了說明問題將情況假設為一個二分類問題。這裡我們將貝葉斯分類器的loss函數定義為(參考《神經網路與機器學習》):

loss=p_1 int_{H_2}p_x(x|tau_1)dx+p_2 int_{H_1}p_x(x|tau_2)dx

這裡假設正確分類沒有代價,同時因為:

int_{H-H_2}p_x(x|tau_1)dx=1- int_{H_1}p_x(x|tau_1)dx

所以:

loss=p_1+int_{H_1}[p_2 p_x(x|tau_2)-p_1 p_x(x|tau_1)]dx

對於 p_1p_2 指的是取自相應樣本空間的概率,為了簡便將其均等於1/2。H為訓練向量取自各自類的子集。根據上式若使得樣本取自類1,同時loss變小:

 frac{p_x(x|tau_2)}{p_x(x|tau_1)}>1

對於高斯分布而言:

p(x|tau_i)=frac{1}{(2pi)^{m/2}det(C_i)}exp(-frac 1 2 (x-mu_i)^T C_i^{-1} (x-mu_i))

對於不等式兩邊取對數:

ln(frac{p_x(x|tau_2)}{p_x(x|tau_1)})=-frac 1 2 (x-mu_1)^T C_1^{-1} (x-mu_1)+frac 1 2 (x-mu_2)^T C_2^{-1} (x-mu_2)

所以對於上面的問題出現了x與x的高次項

顯然對於協方差矩陣相等的情況下並未出現x的二次方項,也就是一個線性分類器,但是對於協方差矩陣不等的情況下,則會出現矩陣的二次方項。現在對這兩種情況分別做一個例子:

協方差矩陣相等情況

這種情況可以用除以矩陣的協方差得到:

from sklearn.naive_bayes import GaussianNBnimport numpy as npn#引入訓練數據nX1 = np.random.normal(size = [600, 2])nX2 = np.random.random([600, 2])n#方差均衡,使得兩個類方差均為1nX1 = X1/np.std(X1)nX2 = X2/np.std(X2)ny = np.concatenate([np.zeros_like(X1[:,0]), np.ones_like(X2[:,0])], axis=0)nX = np.concatenate([X1, X2],axis=0)nn#定義高斯分類器類ngnb = GaussianNB()n#訓練過程ngnb.fit(X, y)n#繪圖庫引入nimport matplotlib.pyplot as pltnimport matplotlib as mplnimport numpy as npn#調整圖片風格nmpl.style.use(fivethirtyeight)n#定義xy網格,用於繪製等值線圖nx_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5ny_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5nxx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),n np.arange(y_min, y_max, 0.1))n#預測可能性nZ = gnb.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]nZ = Z.reshape(xx.shape)nplt.contourf(xx, yy, Z, alpha=.8)n#繪製散點圖nplt.scatter(X[:, 0], X[:, 1], c=y, edgecolors=k)nplt.title("GaussianNaiveBayes")nplt.axis("equal")nplt.show()n

最後做個圖:

協方差矩陣不等情況

首先來看看單層神經網路情況

import tensorflow as tfnimport tensorflow.contrib.slim as slimnimport pandas as pdnimport numpy as npnfrom sklearn.decomposition import PCAnfrom sklearn import datasetsnfrom sklearn.datasets import make_moons, make_circles, make_classificationn#獲取數據nX, y = make_circles(noise=0.2, factor=0.5, random_state=1)nX, y = make_moons(noise=0.3, random_state=0)ny_r = np.zeros([len(X), 2])nfor idx, itr in enumerate(y):n y_r[idx, itr] = 1n#搭建神經網路nnx_tf = tf.placeholder(tf.float32, [None, 2])nlabel_tf = tf.placeholder(tf.float32, [None, 2])nnx2x = tf.concat([x_tf, x_tf[:,:1]*x_tf[:,1:2], x_tf**2], axis=1)ny_tf = slim.fully_connected(x2x, 2, scope=full1, activation_fn=tf.nn.sigmoid, reuse=False)nnce=tf.nn.softmax_cross_entropy_with_logits(labels=label_tf, logits=y_tf)nloss = tf.reduce_mean(ce)ntrain_step = tf.train.AdamOptimizer(0.005).minimize(loss)nnsess = tf.Session()nsess.run(tf.global_variables_initializer())nnfor itr in range(6000):n sess.run(train_step, feed_dict={x_tf: X, label_tf: y_r})nnn#繪圖庫引入nimport matplotlib.pyplot as pltnimport matplotlib as mplnimport numpy as npn#調整圖片風格nmpl.style.use(fivethirtyeight)n#定義xy網格,用於繪製等值線圖nnx_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5ny_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5nxx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),n np.arange(y_min, y_max, 0.1))n#預測可能性npdt = sess.run(y_tf, feed_dict={x_tf: np.c_[xx.ravel(), yy.ravel()]})nZ = pdt[:, 1]nZ = Z.reshape(xx.shape)nplt.contourf(xx, yy, Z, alpha=.6)nn#繪製散點圖nplt.scatter(X[:, 0], X[:, 1], c=y, edgecolors=k)nplt.title("NN")nplt.axis("equal")nplt.show()n

看起來和貝葉斯分類器的結果差不多。

總結

有人說貝葉斯演算法對於數據量少的情況下有良好的結果,這麼來看的確是這樣,因為映射到單層神經網路來思維的話,自由參數數目非常有限,可以有效的避免過擬合。

註:轉載請聯繫


推薦閱讀:

[乾貨|實踐] Tensorflow學習 - 使用flags定義命令行參數
如何使用TensorFlow中的高級API:Estimator、Experiment和Dataset

TAG:机器学习 | 贝叶斯分类 | TensorFlow |