.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 操作的資料結構,一般也有兩種儲存方式 陣列跟鍊錶實現形式,這裡我給出了鍊錶形式的堆疊模板,裡面包括了基本的堆疊所有的操作,還有兩個比較著名的應用例子,時間倉促,精力比較有限,關於迷宮老鼠還沒...