第三章 邏輯回歸的多分類問題

2021-10-08 21:19:23 字數 4476 閱讀 9831

.mat檔案是屬於matlab的檔案,具體有什麼特點和屬性還不知道,但對於本題中我們需要去讀取,要用到python中的scipy庫下的loadmat模組吧應該,去讀取.mat檔案。

import numpy as np

import matplotlib.pyplot as plt

import scipy.io as sio

data = sio.loadmat(

'data/ex3data1.mat'

)raw_x = data[

'x']

raw_y = data[

'y']

print

(data,

type

(data)

)print

(raw_x.shape,raw_y.shape)

>>

>..

.>>

>

<

type

dict

>

>>

>

(5000

,400)(

5000,1

)

用到的方法:

作用**

讀取mat檔案

data = sio.loadmat(『data/ex3data1.mat』)

用到了scipy.io模組下的.loadmat方法,專門用於讀取matlab型別的檔案,返回的型別是字典dict,可以從jupyter中看到raw_x的型別是array陣列型別,並且猜測這是的二進位制陣列格式,本質上就是一張張**。

可以從raw_x的形狀中得知,(5000,400)中的400原本應該是二維的20x20畫素的,為便於儲存拉伸為1x400,所以5000就是5k張**。

def

plot_image

(x):

rdm = np.random.choice(

5000

,100

) images = x[rdm,:]

print

(images.shape)

fig,ax = plt.subplots(ncols=

10,nrows=

10,figsize=(8

,8),sharex=

true

,sharey=

true

)for i in

range(10

):for j in

range(10

):ax[i,j]

.imshow(images[

10* i + j]

.reshape(20,

20).t,cmap=

'gray_r'

) plt.xticks(

) plt.yticks(

) plt.show(

)

用到的方法:

作用**

獲取區間內的隨機整數

rdm = np.random.randint(5000)

獲取區間內的多個隨機整數

rdm = np.random.choice(5000)

顯示ax.imshow(image.reshape(20,20).t,cmap = 『gray_r』)

的資訊都儲存在raw_x的每一行中,每行的陣列都是一張,隨機選取一行,獲取的資訊後還需要對其形狀進行改變,因為此時獲取的是(1,400)需要轉換為(20,20)的,所以在ax.imshow()方法中改變了陣列的形狀,顯示的方法是ax.imshow(),第乙個引數是的陣列資訊,第二個引數是顏色和底色。

本題的損失函式,相對於非線性分類問題中的損失函式差不多,公式用的一樣。

因為本題比較複雜,所以我們不用自己編寫梯度下降函式而是調包使用現成的方法。

這個方法用於優化函式(這裡要優化的函式就是costfunction損失函式)

我們不需要自己重新編寫梯度下降方法,但是我們要提供給改方法梯度向量

這是梯度下降函式的公式,而梯度向量就是後面那一坨。

def

gradient_reg

(theta,x,y,lamda)

: reg = theta[1:

]*(lamda /

len(x)

) reg = np.insert(reg,

0,values=

0,axis=0)

first =

(x.t @ (sigmoid(x @ theta)

-y ))/

len(x)

return first + reg

from scipy.optimize import minimize

defone_vs_all

(x,y,lamda,k)

: n = x.shape[1]

theta_all = np.zeros(

(k,n)

)for i in

range(1

,k+1):

theta_i = np.zeros(n,

)

res = minimize(fun=costfunction,

x0 = theta_i,

args=

(x,y==i,lamda)

, method=

'tnc'

, jac = gradient_reg)

print

(res)

theta_all[i-1,

:]= res.x

return theta_all

思考原理:我們已經知道了每張都是以(401,1)的形狀存在於x集合中,其中400個包含資訊的引數我們都當做了特徵,一共400個特徵值,1個常數項,所以一會的theta形狀也要是(k,401),本題一共需要10個分類器,我們把每個分類器的引數theta都整合到乙個theta_all當中。

類似這樣:

關於**部分:

比如有一張,它的shape是(401,)比作p1,讓theta_all和p1相乘會得到乙個長度為10的一維陣列。

res = theta_all @ p1

print

(res)

>>

>array([-

16.14447,-

9.78841354,-

8.40606098,-

16.03911719,-

4.68367905,-

14.52251444,-

9.24265692,-

12.74947102,-

9.37451931

,6.40369668

])

這10個數的值就是代表該中的數字分別對應0~9的概率,數值越大,則**越有把握。比如上述**的值就是9,真實結果也是9。

邏輯回歸解決多分類問題

第二種方法 從演算法入手 傳統的邏輯回歸只能處理二分類問題,對於多分類任務,主要有如下兩種方案。某個分類演算法有n類,將某一類和另一模擬較作為二分類問題,總共可分為cn2 c cn 2 種不同的二分類模型,給定乙個新的樣本點,求出每種二分類對應的概率,概率最高的一類作為新樣本的 結果。某個分類演算法...

機器學習 邏輯回歸 多分類問題

from sklearn.linear model import logisticregression 1 penalty 使用指定正則化項 預設 l2 2 dual n samples n features取false 預設 3 c 正則化強度,值越小正則化強度越大 4 fit intercept...

第三章 堆疊

1.基礎知識 堆疊可以實現很多的應用,遞迴的問題轉化成非遞迴形式,在本質上也是堆疊的問題.它是一種 filo 操作的資料結構,一般也有兩種儲存方式 陣列跟鍊錶實現形式,這裡我給出了鍊錶形式的堆疊模板,裡面包括了基本的堆疊所有的操作,還有兩個比較著名的應用例子,時間倉促,精力比較有限,關於迷宮老鼠還沒...