日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

吴恩达《机器学习》学习笔记四——单变量线性回归(梯度下降法)代码

發布時間:2024/7/23 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 吴恩达《机器学习》学习笔记四——单变量线性回归(梯度下降法)代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

吳恩達《機器學習》學習筆記四——單變量線性回歸(梯度下降法)代碼

  • 一、問題介紹
  • 二、解決過程及代碼講解
  • 三、函數解釋
    • 1. pandas.read_csv()函數
    • 2. DataFrame.head()函數
    • 3. Dataframe.insert()函數

課程鏈接: https://www.bilibili.com/video/BV164411b7dx?from=search&seid=5329376196520099118

之前介紹了吳恩達機器學習課程的第一個算法——線性回歸,又可以分為一元和多元,優化參數的方法包含梯度下降和正規方程兩種。今天用python來完成一下相關的練習,雖然吳恩達推薦使用Octave,但是用python上手個人感覺更通用。一元的代碼掌握后推廣到多元很簡單,而且梯度下降的優化算法更通用,所以著重講解一下單變量線性回歸(梯度下降法)的代碼。

這次筆記用到的數據集:https://pan.baidu.com/s/1h5Ygse5q2wkTeXA9Pwq2RA
提取碼:ottq

一、問題介紹

使用一個單變量線性回歸模型來預測食品卡車的利潤。假設你是一個特許經營餐廳的CEO,并且正在考慮在不同城市開設新的出口。這個連鎖店已經在各個城市有卡車,你有城市的利潤和人口的數據。

你希望使用此數據來幫助您選擇要擴展的下一個城市。文件ex1data1.txt包含線性回歸問題的數據集。第一列是城市人口,第二列是那個城市里一輛食品卡車的利潤,利潤為負值時表示損失。

下圖為數據集文件內容部分截圖:

一句話說,就是利用城市的人口數據來預測在該城市的利潤,可以采用單變量線性回歸模型。

二、解決過程及代碼講解

首先導入需要使用的模塊:numpy,pandas和matplotlib.pyplot。

# 導入必要的模塊 import numpy as np import pandas as pd import matplotlib.pyplot as plt

讀入數據集,若數據集和代碼文件放在一個文件夾下可以使用相對路徑,否則要使用絕對路徑才能找到數據集。

# 讀入數據集data1.txt path = 'data/data42661/ex1data1.txt' data = pd.read_csv(path, header=None, names=['Population', 'Profit']) data.head() #預覽數據

結果如下:

查看一下數據集的統計信息,包括數據個數、均值、方差、最大最小值等。

data.describe()


也可以通過繪制散點圖具體查看數據集分布。

data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8)) plt.show()


因為是單變量問題,讀入的數據可以表示成這樣:
而為了將假設函數變成如下形式,以便我們可以使用向量化的解決方案來計算代價和梯度:
X需要插入一列1:
代碼是:

data.insert(0, 'Ones', 1) # 變量初始化 # set X (training data) and y (target variable) cols = data.shape[1] X = data.iloc[:,0:cols-1]#X是所有行,去掉最后一列 y = data.iloc[:,cols-1:cols]#X是所有行,最后一列 # 觀察下 X (訓練集) and y (目標變量)是否正確. X.head() #head()是觀察前5行

y.head()


但此時X和y是DataFrame形式,需要轉換為矩陣才方便運算:

# 代價函數是應該是numpy矩陣,所以我們需要轉換X和Y,然后才能使用它們。 我們還需要初始化theta,即把theta所有元素都設置為0. X = np.matrix(X.values) y = np.matrix(y.values) theta = np.matrix(np.array([0,0])) # 查看一下各自的維度 X.shape, theta.shape, y.shape


定義代價函數:

def computeCost(X, y, theta):inner = np.power(((X*theta.T) - y),2) return np.sum(inner)/(2*len(X)) # 計算初始代價函數 (theta初始值為0). computeCost(X, y, theta)

然后就是定義梯度下降算法函數:

def gradientDescent(X, y, theta, alpha, iters):temp = np.matrix(np.zeros(theta.shape))parameters = int(theta.ravel().shape[1])cost = np.zeros(iters)for i in range(iters):error = (X * theta.T) - yfor j in range(parameters):term = np.multiply(error, X[:,j])temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))theta = tempcost[i] = computeCost(X, y, theta)return theta, cost # 初始化學習率和迭代次數,這個是可以手動調節的 alpha = 0.01 iters = 1000 # 調用梯度下降,得到兩個參數的最優值 g, cost = gradientDescent(X, y, theta, alpha, iters)

# 并看一下最優的代價函數值 computeCost(X, y, g)

# 可以看一下此時的假設函數的擬合程度,從圖中看擬合程度還算可以。 x = np.linspace(data.Population.min(), data.Population.max(), 100) f = g[0, 0] + (g[0, 1] * x)fig, ax = plt.subplots(figsize=(12,8)) ax.plot(x, f, 'r', label='Prediction') ax.scatter(data.Population, data.Profit, label='Traning Data') ax.legend(loc=2) ax.set_xlabel('Population') ax.set_ylabel('Profit') ax.set_title('Predicted Profit vs. Population Size') plt.show()


還可以通過看代價函數的變化曲線來判斷是否正確工作。

fig, ax = plt.subplots(figsize=(12,8)) ax.plot(np.arange(iters), cost, 'r') ax.set_xlabel('Iterations') ax.set_ylabel('Cost') ax.set_title('Error vs. Training Epoch') plt.show()

三、函數解釋

1. pandas.read_csv()函數

read_csv()函數是用來讀取csv文件的內容進而轉化為易于操作的數據結構dataframe的常用函數,具有十分強大的功能。

各參數詳解參考:
pandas.read_csv()函數

2. DataFrame.head()函數

在用Pandas讀取數據之后,我們往往想要觀察一下數據讀取是否準確,這就要用到Pandas里面的head( )函數,但是head( )函數只能讀取前五行數據

3. Dataframe.insert()函數

在Dataframe的指定列中插入數據。各參數詳解參考:Dataframe.insert()函數

總結

以上是生活随笔為你收集整理的吴恩达《机器学习》学习笔记四——单变量线性回归(梯度下降法)代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。