1. 程式人生 > >python實現周志華西瓜書《機器學習》習題3.3對數機率迴歸

python實現周志華西瓜書《機器學習》習題3.3對數機率迴歸

python小白入手,第一個程式。
首先感謝大牛的原始碼:

大牛的思路很巧妙,把矩陣操作轉化成列表操作,時刻保證列表代表的矩陣維度一致。
我貢獻的內容就是比較詳細的註釋,希望幫助更多的小白一起看懂


#程式碼基本是抄https://blog.csdn.net/onthewaygogoing/article/details/68485682
import numpy as np
#linalg是線性代數模組,包括求範數
from numpy import linalg
#pandas是匯入表格資料的方法,詳見http://codingpy.com/article/a-quick-intro-to-pandas/
import pandas as pd #定義excel檔案的讀取路徑 inputfile='/Users/huatong/PycharmProjects/Data/xiguaexcel.xls' #讀取資料檔案,引數只填路徑就可以 data_original=pd.read_excel(inputfile) #βTx實際上是β乘x的轉置。這裡的beta是書裡已經轉置過的,x是第一行密度,第二行含糖量的矩陣,下面的x也就是書裡的x^=(x;1)的轉置。 #numpy array用於構造陣列。read_excel讀取出的資料是元組結構tuple。列表可讀寫元組只讀。list用於把元組轉換成列表,也就是把表格資料打散。單引號指定某一列
x=np.array([list(data_original['density']),list(data_original['suger']),[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]]) #y是是否好瓜,因為後面βTx的結果是一行,y也就是一行了 y=np.array(list(data_original['good'])) #定義初始引數,注意這個beta是書裡β=(w;b)的轉置 beta=np.array([[0],[0],[1]]) #3.27式的l(β),是上一次迭代的l值 old_l=0 #n是迭代次數 n=0 #迭代 while 1: #numpy dot是矩陣相乘,numpy T是求轉置矩陣,因為β轉置後只有一行,只需要轉置後第一行與x^相乘
beta_T_X=np.dot(beta.T[0],x) #python沒有陣列概念,後面的beta_T_x[i]也就是列表中i元素的數值 cur_l=0 #初始化l值,以下求和 for i in range(17): cur_l=cur_l+(-y[i]*beta_T_X[i]+np.log(1+np.exp(beta_T_X[i]))) #式3.27,目標是求使得這個值最小的β #迭代終止條件 if np.abs(cur_l-old_l)<=0.000001: #abs求絕對值,相差小於0.000001認為收斂 break #牛頓法更新β,根據式3.29到3.31 n=n+1 old_l=cur_l dbeta=0 #一階導,下面是二階導 d2beta=0 for i in range(17): #這裡的x是轉置後的,因此這一步要再轉置回來 dbeta=dbeta-np.dot(np.array([x[:,i]]).T,(y[i]-(np.exp(beta_T_X[i])/(1+np.exp(beta_T_X[i]))))) d2beta=d2beta+np.dot(np.array([x[:,i]]).T,np.array([x[:,i]]).T.T)*(np.exp(beta_T_X[i])/(1+np.exp(beta_T_X[i])))*(1-(np.exp(beta_T_X[i])/(1+np.exp(beta_T_X[i])))) beta=beta-np.dot(linalg.inv(d2beta),dbeta) #inv是矩陣求逆 print('模型引數是:',beta) print('迭代次數:',n)