一、本案例主要利用python代碼解決“采用實現線性回歸(單一變量)來預測一輛食品卡車的利潤的問題”,代碼中涉及到機器學習中的線性回歸理論知識,本文不着重介紹(詳細可參考吳恩達的《機器學習》),主要介紹其代碼實現過程(源代碼參考吳恩達的《機器學習》的課后作業),也可參考我寫的matlab代碼實現編寫的文檔。
二、實驗結果如圖所示:
1)訓練集的數據分布圖:
2)線性回歸圖
3)批量梯度下降函數計算代價成本值:
三、實現代碼如下:ex1.py

1 # -*- coding: utf-8 -*- 2 """ 3 機器學習之單一變量線性回歸 4 """ 5 #導入相關庫 6 import pandas as pd 7 import matplotlib.pyplot as plt 8 import numpy as np 9 #設置字體的更多屬性 10 font={ 11 'family':'SimHei', 12 'weight':'bold', 13 'size' : '16' 14 } 15 plt.rc('font',**font) 16 #解決坐標軸負軸的符號顯示的問題 17 plt.rc('axes',unicode_minus=False) 18 #損耗函數算法代碼,theta.T轉置,矩陣計算 19 def computeCost(X,y,theta): 20 21 m=len(y) 22 inner = np.power(((X * theta.T) - y), 2) 23 return np.sum(inner) / (2 * m) 24 #批量梯度下降算法 25 # 該函數通過執行梯度下降算法次數來更新theta值,每次迭代次數跟學習率有關 26 # 函數參數說明: 27 # X :代表特征/輸入變量 28 # y:代表目標變量/輸出變量 29 # theta:線性回歸模型的兩個系數值(h(x)=theta(1)+theta(2)*x) 30 # alpha:學習率 31 # iters:迭代次數 32 def gradientDescent(X, y, theta, alpha, iters): 33 temp = np.matrix(np.zeros(theta.shape)) 34 parameters = int(theta.ravel().shape[1]) 35 cost = np.zeros(iters) 36 37 for i in range(iters): 38 error = (X * theta.T) - y 39 40 for j in range(parameters): 41 term = np.multiply(error, X[:,j]) 42 temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term)) 43 44 theta = temp 45 cost[i] = computeCost(X, y, theta) 46 47 return theta, cost 48 if __name__ == '__main__': 49 #讀取訓練數據集中的數據 50 #%文件ex1data1.txt包含了我們的線性回歸問題的數據集。 51 #第一列是城市的人口(單位100000),第二列是城市里的一輛食品卡車的利潤。 52 #利潤的負值表示損失 53 train_data=pd.read_csv('ex1data1.txt',names=['Population','Profit']) 54 55 #將訓練集中的數據在圖中顯示 56 train_data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8)) 57 plt.show() 58 59 #我們在訓練集中添加一列,以便我們可以使用向量化的解決方案來計算代價和梯度。 60 train_data.insert(0,'Ones',1) 61 X=train_data.iloc[:,[0,1]]#X是所有行,去掉最后一列 62 y=train_data.iloc[:,2]#y是所有行,最后一列 63 #代價函數是矩陣計算,所以需要將X,y,theta轉變為矩陣 64 X = np.matrix(X.values) 65 y = np.matrix(y.values) 66 y=y.T#轉置 67 theta = np.matrix(np.array([0,0])) 68 print(X.shape, theta.shape, y.shape) 69 #初始化一些附加變量 - 學習速率α和要執行的迭代次數。 70 iters = 5000#迭代次數設置為1500次 71 alpha = 0.01#學習率設置為0.01. 72 computeCost(X, y, theta) 73 g, cost = gradientDescent(X, y, theta, alpha, iters)#g是求出的最佳theat值,cost是所有迭代次數的代價函數求出的值 74 print('求出的最佳theat值:',g) 75 #將線性回歸函數畫出 76 x = np.linspace(train_data.Population.min(), train_data.Population.max(), 100) 77 f = g[0, 0] + (g[0, 1] * x) 78 79 fig, ax = plt.subplots(figsize=(12,8)) 80 ax.plot(x, f, 'r', label='預測函數') 81 ax.scatter(train_data.Population, train_data.Profit, label='訓練數據') 82 ax.legend(loc=2) 83 ax.set_xlabel('人口') 84 ax.set_ylabel('利潤') 85 ax.set_title('預測利潤和人口數量') 86 plt.show() 87 # 預測人口規模為3.5萬和7萬的利潤值 88 predict1 = g[0,0]*1+(g[0, 1] * 3.5) 89 print('當人口為35,000時,我們預測利潤為',predict1*10000); 90 predict2 = g[0,0]*1+(g[0, 1] * 7) 91 print('當人口為70,000時,我們預測利潤為',predict2*10000); 92 #由於梯度方程式函數也在每個訓練迭代中輸出一個代價的向量, 93 #所以我們也可以繪制。 請注意,代價總是降低 - 這是凸優化問題的一個例子。 94 fig, ax = plt.subplots(figsize=(12,8)) 95 ax.plot(np.arange(iters), cost, 'r') 96 ax.set_xlabel('迭代次數') 97 ax.set_ylabel('輸出代價') 98 ax.set_title('誤差和訓練狀態') 99 plt.show()