- 題目理解
-
編程實現對率回歸,分析西瓜數據集3.0α上的運行結果:
將西瓜數據集分成訓練集和測試集,利用對率回歸模型分析運行結果。
-
- 算法原理
-
對率回歸模型是一個典型的二分類任務學習模型,二分類問題輸出標記y∈{0,1},最理想的是“單位階躍函數”:
但是單位階躍函數不連續,不能直接用於線性模型的預測。因此需要找到一個類似的連續函數,即參數在取中間值時函數變化陡峭,參數在取+∞或-∞時,函數趨近與1和0,以此來替代單位階躍函數,即:

將線性回歸方程與對數幾率函數合並,得到:

-
- 算法設計
-
使用對率回歸模型預測y值以及用梯度下降法訓練得到w和b的值。
① 求解w和b的值時,首先設定迭代次數和迭代步長,將w和b合並表示為一個增廣矩陣β,並用迭代步長初始化β;
② 利用梯度下降法先計算出梯度:

進而更新得到Δβ和下一步的β。
③ 在規定的迭代次數內得到β,然后用對率回歸模型對測試集進行預測並分析結果。
-
- 核心代碼
-
1 # ①極大似然法估計w和b 2 def likelihood_sub(x, y, beta): # (樣本變量,樣本標簽,3.27中的參數向量) 3 return -y * np.dot(beta, x.T) + np.math.log(1 + np.math.exp(np.dot(beta, x.T))) 4 5 def likelihood(X, y, beta): # (樣本變量矩陣,樣本標簽矩陣,3.27中的參數向量) 6 sum = 0 7 m,n = np.shape(X) # m:X的第一個維度;n:X的第二個維度 8 for i in range(m): 9 sum +=likelihood_sub(X[i], y[i], beta) 10 return sum
單次迭代內部對β的更新:使用極大似然法對w,b進行估計。
1 # ②基於訓練集x->[x,1],給出基於3.27的似然函數的定步長梯度下降法,注意偏梯度的實現技巧 2 def gradDscent(X, y): 3 h = 0.1 # 迭代步長 4 max_times = 500 # 迭代次數限制 5 m, n = np.shape(X) 6 beta = np.zeros(n) # 初始化 7 delta_beta = np.ones(n)*h 8 print("初始化delta_beta:", delta_beta) 9 llh = 0 10 llh_temp = 0 11 for i in range(max_times): 12 beta_temp = beta.copy() # 返回beta的拷貝 13 14 # 偏導數 15 for j in range(n): 16 beta[j] +=delta_beta[j] 17 llh_tmp = likelihood(X, y, beta) # 梯度 18 delta_beta[j] = -h * (llh_tmp - llh) / delta_beta[j] 19 beta[j] = beta_temp[j] 20 21 beta += delta_beta 22 print(beta) 23 llh = likelihood(X, y, beta) 24 return beta
梯度下降完成迭代:由於是基於訓練集同時對w和b即β進行估計,因此將訓練集X擴展到[X, 1],基於似然函數的定步長梯度下降法完成迭代。
-
- 結果展示


