判別式模型

2022-05-03 18:06:10 字數 4191 閱讀 6893

本文主要通過logistics regression講解判別式模型

由上文生成式模型的講解,我們大致了解了生成式模型,首先通過假設某些條件求出了聯合概率密度分布,再通過貝葉斯公式求出相應的分類概率。

判別式模型則是完全通過資料進行分析,沒有任何人為的假設。

首先我們看一下上文中最後推出的後驗概率:

\[\begin

p(blue|x) &= \frac\\

&= \frac}

\end

\]此時我們令 \(z=ln\frac\),求出\(\frac = e^\)

帶入\(p(blue|x)\)變為

\[p(blue|x) =\frac}

\]學過的同學一看就知道這就是logistics distribution。這個影象估計都看膩了,我就不講解了。

目前的問題就是需要知道我們假設的 \(z\) 是什麼樣的。\(z=ln\frac\)。

此處我直接寫出結論,不再進行推導了。說明一下如何推導,我們可以假設\(p(x|blue),p(x|green)\)服從某一種分布。將其分布帶入到後驗概率。即可求出

\[z = wx+b

\]這種樣式。(無論用哪種分布,都會得到這樣的形式,這樣就不要人為假設服從哪種分布了

既然這樣, 那我們直接將函式變為

\[p(blue|x) =\frac}

\]目前我們的任務是如何求出 \(w,b\) 。我們只有樣例資料,當然只能利用樣例資料來求了。。那怎麼求呢,因為資料有自變數取值,樣例分類。——那我們就可以定義乙個損失函式,利用梯度下降求出最優的 \(w,b\)

首先利用最大似然估計

\[h(w,b) = \prod_^(y^ip(blue|x^i)+(1-y^i)(1-p(blue|x^i)))

\]遇到連乘的問題首先取 \(ln\) 變為連加。

\[h(w,b) = \sum_^ ln (y^ip(blue|x^i)+(1-y^i)(1-p(blue|x^i)))

\]目標函式變為:

\[w^,b^ = \mathop h(w,b)}

\]為了好看,改一下:

\[w^,b^ = \mathop -h(w,b)}

\]接下來就可以利用梯度下降了。

此處用梯度下降

\[\begin

w^ &= w - \eta \frac \\

b^ &= b -\eta \frac

\end

\]將\(h(w,b)\)代入可得

\[\begin

w^ &= w - \eta \sum_^ ( p(x^i)- y^i )*x^i \\

b^ &= b -\eta \sum_^ p(x^i) - y^i

\end

\]最終求得 \(w^\) 和 \(b^\)

迭代10000次得到的結果為

\[\begin

w &= [-1.48102123 1.37684754] \\

b &= 3.773931680340649

\end

\]畫出\(p(blue|x)\)的等高線可以看出在概率為0.5時還是能較好的分開兩組資料

可以看出判別式模型中,完全是依據資料進行的分析,沒有新增任何人為的假設(對於任意的分布\(z\)都滿足\(z=wx+b\)的形式),直接根據貝葉斯後驗概率進行的推導。

至此兩種模型都講完,這兩者模型各有優缺點,當資料很少的時候,或許生成式模型中人為加入的限制更加有利於資料的分類,這會使得擬合效果更好。

附上**:

# classification

# only use part[0] & part[1]

# @author hongchuan cao

# @date 2019-7-8

from sklearn import datasets

import numpy as np

import matplotlib.pyplot as plt

class sgd(object):

def __init__(self):

self.iris = datasets.load_iris()

self.part = [, , ]

def classify(self):

for i in range(len(self.iris.target)):

# change list to array

for i in range(0, 3):

self.part[i] = np.array(self.part[i])

print(self.part[0][1])

def gradient(self):

w = np.array([1., 1.])

b = 4

learn_ratio = 0.001

iteration = 10000

for j in range(iteration):

sum_w = np.array([0., 0.])

sum_b = 0

for i in range(len(self.part[0])):

sum_w += (1.0 / (1 + np.exp(-1 * (np.dot(w, self.part[0][i].t) + b))) - 1) * self.part[0][i]

sum_b += (1.0 / (1 + np.exp(-1 * (np.dot(w, self.part[0][i].t) + b))) - 1)

for i in range(len(self.part[1])):

sum_w += (1.0 / (1 + np.exp(-1 * (np.dot(w, self.part[1][i].t) + b)))) * self.part[1][i]

sum_b += (1.0 / (1 + np.exp(-1 * (np.dot(w, self.part[1][i].t) + b))))

w = w - learn_ratio * sum_w / (len(self.part[0]) + len(self.part[1]))

b = b - learn_ratio * sum_b / (len(self.part[0]) + len(self.part[1]))

print(j, '-----------')

print(w,b)

return w, b

def ff(self, w, b, x):

return 1.0 / (1 + np.exp(-1 * (np.dot(w, x.t) + b)))

def plot1(self):

w, b = self.gradient()

xx = [x for x in np.arange(2, 8, 0.1)]

yy = [y for y in np.arange(1, 7, 0.1)]

z = [[self.ff(w, b, np.array([x, y])) for x in xx] for y in yy]

x, y = np.meshgrid(xx, yy)

cntr1 = plt.contourf(x, y, z)

plt.clabel(cntr1, colors='k', inline_spacing=3, fmt='%.1f', fontsize=10)

plt.plot(self.part[0][:, 0], self.part[0][:, 1], 'b.', label='0')

plt.plot(self.part[1][:, 0], self.part[1][:, 1], 'g.', label='1')

# plt.plot(self.part[2][:,0], self.part[2][:,1], 'r.', label='2')

plt.legend()

plt.xlabel('attribute0')

plt.ylabel('attribute1')

plt.show()

if __name__ == '__main__':

obj = sgd()

obj.classify()

obj.plot1()

判別式模型與生成式模型

判別式模型 該模型主要對p y x 建模,通過x來 y。在建模的過程中不需要關注聯合概率分布。只關心如何優化p y x 使得資料可分。通常,判別式模型在分類任務中的表現要好於生成式模型。但判別模型建模過程中通常為有監督的,而且難以被擴充套件成無監督的。常見的判別式模型有 logistic regre...

判別式模型與生成式模型

產生式模型 generative model 與判別式模型 discrimitive model 是分類器常遇到的概念,它們的區別在於 對於輸入x,類別標籤y 產生式模型估計它們的聯合概率分布p x,y 判別式模型估計條件概率分布p y x 產生式模型可以根據貝葉斯公式得到判別式模型,但反過來不行。...

判別式模型和生成式模型

判別式模型與生成式模型 生成式模型 generative model 與判別式模型 discrimitive model 是分類器常遇到的概念,它們的區別在於 對於輸入x,類別標籤y 1.生成式模型估計它們的聯合概率分布p x,y 2.判別式模型估計決策函式f x 或條件概率分布p y x 3.生成...