機器學習之線性回歸(單一變量)代碼實現(python代碼實現)


一、本案例主要利用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()
View Code


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM