機器學習 softmax回歸 python實現

2022-09-11 19:30:20 字數 3136 閱讀 8151

---恢復內容開始---

softmax regression 可以看做是 lr 演算法在多分類上的推廣,即類標籤 y 的取值大於或者等於 2。

假設資料樣本集為:$\left \,y ^ \right ) ,\left ( x^,y ^ \right ),\left ( x^,y ^ \right ),...,\left ( x^,y ^ \right )\right \}$

對於 sr 演算法,其輸入特徵為:$ x^ \in \mathbb^$,類別標記為:$y^ \in \$,假設函式為每乙個樣本估計其所屬類別的概率 $p(y=j|x)$,具體的假設函式為:

$h_(x^) =\begin

p(y^=1|x^;\theta)\\

p(y^=2|x^;\theta)\\

...\\

p(y^=k|x^;\theta)

\end = \frac^e^}}\begin

e^}\\

e^}\\

...\\

e^}\end$

其中,$\theta$表示的向量,且 $\theta_i \in \mathbb^$,則對於每乙個樣本估計其所屬的類別的概率為

$p(y^=j|x^;\theta) = \frac}}^e^}}$

sr 的損失函式為:

$j(\theta) = -\frac \left [\sum_^ \sum_^ i \=j \} \log \frac}}^e^}} \right ]$

其中,$i(x) = \left\

0 & if\;\;x = false\\

1 & if\;\;x = true

\end\right.$ 表示指示函式。

對於上述的損失函式,可以使用梯度下降法求解:

首先求引數的梯度:

$\frac = -\frac\left [ \sum_^\********down _\left \^i(y^=j) \log\frac}}^e^}}  \right \}  \right ]$

當 $y^=j$ 時, $\frac = -\frac\sum_^\left [\left ( 1-\frac}}^e^}} \right )x^  \right ]$

當 $y^\neq j$ 時,$\frac = -\frac\sum_^\left [\left (-\frac}}^e^}} \right )x^  \right ]$

因此,最終結果為:

$g(\theta_j) = \frac = -\frac\sum_^\left [x^ \cdot \left ( i\left \=j \right \}-p( y^=j|x^;\theta) \right )  \right ]$

梯度下降法的迭代更新公式為:

$\theta_j  = \theta_j - \alpha \cdot g(\theta_j)$

主要python**

def

gradientascent(feature_data,label_data,k,maxcycle,alpha):

'''梯度下降求解softmax模型

:param feature_data: 特徵

:param label_data: 標籤

:param k: 類別個數

:param maxcycle: 最大迭代次數

:param alpha: 學習率

:return: 權重

'''m,n =np.shape(feature_data)

weights = np.mat(np.ones((n,k))) #

一共有n*k個權值

i =0

while i <=maxcycle:

i+=1err = np.exp(feature_data*weights) #

e^(\theta_j * x^i)

if i%100==0:

print ("

\t-----iter:

",i,"

,cost:

",cost(err,label_data))

rowsum = -err.sum(axis = 1)

rowsum = rowsum.repeat(k,axis = 1)

err = err/rowsum #

-p(y^i = j|x^i;0)

for x in

range(m):

err[x,label_data[x,0]]+=1 #

i(y^i = j)-p(y^i = j|x^i;0)

weights = weights+(alpha/m)*feature_data.t*err #

weights

return weights

view code

def

cost(err,label_data):

'''計算損失函式值

:param err: exp的值

:param label_data: 標籤值

:return: sum_cost/m:損失函式值

'''m =np.shape(err)[0]

sum_cost = 0.0

for i in

xrange(m):

if err[i,label_data[i,0]] / np.sum(err[i,:])>0:

sum_cost -=np.log(err[i,label_data[i,0]]/np.sum(err[i,:]))

else

: sum_cost-=0

return sum_cost/m

view code

sklearn**:

lr = logisticregressioncv(fit_intercept=true, cs=np.logspace(-5, 1, 100),

multi_class='

multinomial

', penalty='

l2', solver='

lbfgs

',max_iter = 10000,cv = 7)#

multinomial表示多類即softmax回歸

re = lr.fit(x_train, y_train)

view code

機器學習之Softmax回歸模型

softmax在機器學習中有非常廣泛的應用,但是剛剛接觸機器學習的人可能對softmax的特點以及好處並不理解,其實你了解了以後就會發現,softmax計算簡單,效果顯著,非常好用。我們先來直 一下,softmax究竟是什麼意思 我們知道max,假如說我有兩個數,a和b,並且a b,如果取max,那...

機器學習之softmax回歸筆記

logistic回歸是用來解決二類分類問題的,如果要解決的問題是多分類問題呢?那就要用到softmax回歸了,它是logistic回歸在多分類問題上的推廣。此處神經網路模型開始亂入,softmax回歸一般用於神經網路的輸出層,此時輸出層叫做softmax層。首先介紹一下softmax函式,這個函式可...

機器學習之softmax回歸筆記

logistic回歸是用來解決二類分類問題的,如果要解決的問題是多分類問題呢?那就要用到softmax回歸了,它是logistic回歸在多分類問題上的推廣。此處神經網路模型開始亂入,softmax回歸一般用於神經網路的輸出層,此時輸出層叫做softmax層。首先介紹一下softmax函式,這個函式可...