1. 程式人生 > >吳恩達機器學習程式設計題ex1上 單變數線性迴歸: (python版含題目要求、程式碼、註解)

吳恩達機器學習程式設計題ex1上 單變數線性迴歸: (python版含題目要求、程式碼、註解)

不得不說安卓老師是真的用心良苦,給我們把程式設計題弄成了填空題,但是很可惜原版使用的是OctaveMATLAB所以作為初學者我就直接當程式設計題用python去做了

問題:讓你繪製一個5階單位陣

答案:

 

在本練習的這一部分,你將應用線性迴歸來實現通過用一個變數x(人口)預測y(食品卡車的利潤)。假設你是一位執行長,餐飲連鎖店正在考慮不同的城市開設新的出口。這個連鎖已經把卡車開到了各個城市,現在你有來自城市的利潤和人口的資料了。你希望使用這些資料來幫助你選擇擴充套件哪個城市。

你希望通過這些資料來輔助你決定下一步選擇擴充套件哪個城市。

檔案EX1DATA1.TXT

包含了我們的線性迴歸問題的資料集。第一列是城市的人口,第二列是那個城市的食品卡車的利潤。利潤的負值表示損失。

在開始任何任務之前,通過資料視覺化來理解資料是有很有用的。對於這個資料集,可以使用散點圖來視覺化他。因為它只只有兩個屬性需要繪製(利潤和人口)。

而在現實生活中你會遇到很多其他問題是不能在二維圖上繪製的。

EX1.M中,將資料集從資料檔案載入到變數X中和Y

問題:讓你繪製一個數據集的散點圖

答案:

在這一部分中,你將採用梯度下降法通過線性迴歸找到合適的引數θ去擬合到我們的資料集。

這裡題目寫的是θ^tx就是 1*2  *  2*m 我們為了程式設計中方便觀察(如果

xm列那看起來就太糟糕了)把x寫成m2列的形式 其實就是題目中的(θ^tx^t

為資料新增θ0這個截距項(線性方程的常數項)的維度並將θ初始化為0,設定學習速率為0.01,迭代次數為1500

當你執行梯度下降最小化代價函式時,通過計算代價值將幫你監控收斂性,計算代價函式 在你做的時候切記xy不是標量而是代表訓練集的行矩陣,當θ為初始值時這個函式執行出來的結果是32.07

接下來你將對文字執行梯度下降 安卓老師已經幫我們寫好了迴圈結構 只需要我們填空(再次為老師點贊是真的良心)我們想要把J(θ)降到最小 當你更新引數時切記是更新xy的向量而不是一個xy的引數值 如果你忘了怎麼做

請你回看視訊 一個好的方法去檢驗梯度下降法是否正常工作:每次迭代都會呼叫函式computeCost去檢驗費用 如果你的方法正確那麼費用絕對不會增加 並且在演算法接近最後的時候 J(θ)會逐漸收斂到一個值 你的最終價值將用於預測這些人口面積在3W57W之間的對應利潤 注意下面幾個TIPS 使用的是矩陣乘法而不是數字運算

吳恩達再次強調你要做的是向量運算而不是數值運算

為了更好地理解代價函式 現在你將繪製θ0θ1二維網格圖。在這部分 你不需要編寫任何新的程式碼 但是你應該理解你是如何這些程式碼是如何繪製這些影象的。

在程式碼執行後會生成上述影象

這些圖表的目的是向你展示J (θ)是如何隨θ0θ1的變化而變化的。成本函式J (θ)是碗形的 具有全域性最小值(在等高線圖中比在3D曲面圖更容易看出)這個最小值對應的是θ0θ1就是θ0θ1的最優點 並且梯度下降的每一步都更接近這個點。

完整程式碼及註解

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def warmupExercise():
    E5 = np.eye(5)  # eye(5)代表5階單位陣
    print('這是一個五階單位陣')
    print(E5)

def plotDatainit(x, y):

    plt.title('ex1Sample')#圖的標題
    plt.plot(x, y, 'rx', ms=5)#ms=5代表散點大小為5個單位
    plt.xticks(np.arange(4,24,2))#設定x軸的尺度(這裡和吳老師在pdf上繪製一致從4開始24結束,2為組距)
    plt.yticks(np.arange(-5,25,5))#設定y軸尺度
    plt.xlabel('Population of City in 1,0000s')#橫軸的含義:x:城市人口
    plt.ylabel('Profit in $1,0000s')#縱軸含義y:收益
    plt.show()

def plotData(x, y,theta0,theta1):

    plt.title('ex1Sample')#圖的標題
    plt.plot(x, y, 'rx', ms=5)#ms=5代表散點大小為5個單位
    plt.xticks(np.arange(4,26,2))#設定x軸的尺度(這裡和吳老師在pdf上繪製一致從4開始24結束,2為組距)
    plt.yticks(np.arange(-5,25,5))#設定y軸尺度
    plt.xlabel('Population of City in 1,0000s')#橫軸的含義:x:城市人口
    plt.ylabel('Profit in $1,0000s')#縱軸含義y:收益
    x = np.arange(4, 24)
    y = theta0+theta1*x
    plt.plot(x, y)
    plt.show()

def computeCost(X,y,theta,num):
  m=num
  result=np.sum((np.dot(X,theta)-y)**2)/(2*m)#計算假設函式的值
  return result

def gradientDescent(X,y,theta,num,studyrate,iterations):
    m=num
    J_every=np.zeros((iterations,1))#用於儲存每次迭代計算出的costfunction值
    theta_every=np.zeros((interations,2))
    XT=X.T#為保證矩陣乘法行列要求 接下來計算會用到X的轉置
    for i in range(interations):
        #dJdivdtheta = np.sum(np.dot(XT,((np.dot(X, theta) - y))/m )) #這是錯的
        dJdivdtheta = (np.dot(XT,((np.dot(X, theta) - y))/m ))#這是對的
        theta = theta - studyrate * dJdivdtheta
        theta_every[i][0]=theta[0][0]
        theta_every[i][1]=theta[1][0]
        J_every[i] = computeCost(X, y, theta,num)
    return theta,J_every,theta_every

def showCostfunction(interations):
  for i in range(interations):
    print('第',i+1,'次迭代的代價函式值為',costhistory[i],'theta0和theta1分別是',thetahistory[i])

def predictProfit():
  predict1=np.dot(np.array([1,3.5]),thetai)#預測3.5W人口的利潤
  predict2=np.dot(np.array([1,7]),thetai)#預測7W人口的利潤
  print("3W5人口利潤是",(predict1[0]*10000))
  print("7W人口的利潤是",(predict2[0]*10000))

def plot3DJtheta():
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    xx=list(thetahistory[:,0])#把thetahistory的第1列即使theta0變成一個1500個元素組成的列表
    yy=list(thetahistory[:,1])#把thetahistory的第2列即使theta1變成一個1500個元素組成的列表
    zz=costhistory.reshape(1500)#把costhistory形狀弄成1500個的橫著的
    # 網上抄的如上
    ax.set_xlabel("theta0", color='b')
    ax.set_ylabel("theta1", color='g')
    ax.set_zlabel("Z(theta)", color='r')
    ax.plot_trisurf(xx, yy, zz,color='red')
    plt.show()

def plotContour(thetai,X,y,num):#這個函式是網上抄的-0-
    theta0_vals = np.linspace(-10, 10, 100)
    theta1_vals = np.linspace(-1, 4, 100)
    J_vals = np.zeros((len(theta0_vals), len(theta1_vals)))
    for i in range(len(theta0_vals)):
        for j in range(len(theta1_vals)):
            t = np.array([theta0_vals[i], theta1_vals[j]]).reshape((2, 1))
            J_vals[i, j] = computeCost(X, y, t, num)
    J_vals = J_vals.T
    # fig = plt.figure()
    # ax = Axes3D(fig)
    # ax.plot_surface(theta0_vals, theta1_vals, J_vals, rstride=1, cstride=1, cmap='rainbow')
    # plt.xlabel('theta_0')
    # plt.ylabel('theta_1')
    # 這部分是3D圖
    # 填充顏色,20是等高線分為幾部分
    plt.contourf(theta0_vals, theta1_vals, J_vals, 20, alpha=0.6, cmap=plt.cm.hot)
    plt.contour(theta0_vals, theta1_vals, J_vals, colors='black')
    plt.plot(thetai[0], thetai[1], 'r', marker='x', markerSize=10, LineWidth=2)  # 畫點
    plt.show()


warmupExercise()
dataset=np.loadtxt('ex1data1.txt',delimiter=',')#讀取資料集文字
xx=dataset[:,0]#取出文字的第一列
yy=dataset[:,1]#取出文字的第二列
num=len(xx)
#print(num) #看看有多少個x (有97個數據)
x=xx.reshape(num,1)#轉成num行的列向量
y=yy.reshape(num,1)#同上
thetainit=np.zeros((2,1))#由題設theta包含兩個引數常數項theta0和一階係數theta1 後面會更新theta所以初始化是一個空矩陣 是2行1列的矩陣
juzhenx=np.array(x).reshape(len(x),1)#資料集中屬性x轉換成一個n行1列的矩陣
X0=np.ones((len(x), 1))#因為假設函式是theta0加theta1*x 所以我們後續的計算涉及到矩陣運算
X = np.c_[X0, juzhenx]#把矩陣x(97行1列)拼在X0(97行1列)右邊 形成一個97行2列的矩陣X
#X=np.hstack((X0,juzhenx))#這是矩陣拼接的另外一個方法
#print(X)#看看X是否符合要求
#print(X.shape)#看看X行列是否符合要求
studyrate=0.01
interations=1500
print("Costfuction的初始值是",computeCost(X,y,thetainit,num))#檢視還未更新的代價函式值
thetai,costhistory,thetahistory=(gradientDescent(X,y,thetainit,num,studyrate,interations))
showCostfunction(interations)
predictProfit()
plotData(x, y,thetai[0],thetai[1])
plot3DJtheta()
plotContour(thetai,X,y,num)

見下

相關推薦

機器學習程式設計ex1 變數線性迴歸 (python題目要求程式碼註解)

不得不說安卓老師是真的用心良苦,給我們把程式設計題弄成了填空題,但是很可惜原版使用的是Octave和MATLAB所以作為初學者我就直接當程式設計題用python去做了 問題:讓你繪製一個5階單位陣 答案:   在本練習的這一部分,你將應用線性迴歸來實現通

機器學習程式設計ex1下 多變數線性迴歸 (python題目要求程式碼註解)

在這部分中,你將使用多變數線性迴歸去預測房屋價格,假設你要賣掉房子而且你想知什麼是一個好的市場價格,去做的一個方式就是首先收集最近出售的房子資訊並製作房屋價格的模型,檔案ex1data2/txt包含了一個房屋價格在Portland的訓練集,第一列是房子大小,第二列是臥室的

機器學習筆記(參考機器學習視訊筆記)04_多變數線性迴歸

4 多變數線性迴歸 4.1 多維特徵 代表特徵矩陣中第i行的第j個特徵,也就是第i個訓練例項的第j個特徵。 支援多變數的假設函式h表示為:,其中,引入。此時模型中的引數是一個n+1維的向量,特徵矩陣X的維度是m*(n+1)。因此公式可以簡化為:。 4.2 多變數梯度下降 在多

機器學習練習2——正則化的Logistic迴歸

機器學習練習2——正則化的Logistic迴歸 過擬合 如果我們有非常多的特徵,我們通過學習得到的假設可能能夠非常好地適應訓練集(代價函式可能幾乎為0),但是可能會不能推廣到新的資料。 解決: 1.丟棄一些不能幫助我們正確預測的特徵。可以是手工選擇保留哪些特

Coursera--機器學習-(第11周筆記)應用例項photo OCR

Week 11 ——Application Example: Photo OCR 目錄 影象OCR(Optical Character Recognition) 1-1 問題描述 在這一段介紹一種 機器學習的應用例項 照片OCR技術

斯坦福機器學習公開課筆記(一)--變數線性迴歸

授課老師:Andrew Ng 1、model representation(建立模型) 考慮一個問題,如果給定一些房屋售價和房屋面積的資料,現在要預測給定其他面積時的房屋售價,那該怎麼辦?其實這是一個線性迴歸問題,給定的資料作為訓練樣本,用其訓練得到一個表示售價和麵積關

斯坦福大學() 機器學習課後習題詳解 第七週程式設計 SVM

作業下載地址:https://download.csdn.net/download/wwangfabei1989/103046171. 高斯核函式gaussianKernelfunction sim = gaussianKernel(x1, x2, sigma)%RBFKER

斯坦福大學() 機器學習課後習題詳解 第四周 程式設計 多分類和神經網路

作業下載地址:https://download.csdn.net/download/wwangfabei1989/103008901. 邏輯迴歸代價函式 lrCostFuctionfunction [J, grad] = lrCostFunction(theta, X, y,

斯坦福大學() 機器學習課後習題詳解 第二週 程式設計 線性迴歸

習題可以去這個地址下載 http://download.csdn.net/download/wwangfabei1989/102654071. warmUpExercise.m的實現如下:  function A = warmUpExercise()%WARMUPEXERCI

斯坦福大學() 機器學習課後習題詳解 第六週 程式設計 正則化線性迴歸以及方差與偏差

作業下載地址:https://download.csdn.net/download/wwangfabei1989/103031341. 正則化線性迴歸代價函式 linearRegCostFunctionfunction [J, grad] = linearRegCostFun

斯坦福大學() 機器學習課後習題詳解 第九周 程式設計 異常檢測與推薦系統

作業 下載 地址:https://download.csdn.net/download/wwangfabei1989/103261751. estimateGaussian.m function [mu sigma2] = estimateGaussian(X)%ESTIMA

斯坦福大學() 機器學習課後習題詳解 第八週 程式設計 k-means and PCA

程式設計作業下載地址:https://download.csdn.net/download/wwangfabei1989/103181651. PCA.mfunction [U, S] = pca(X)%PCA Run principal component analysis

機器學習筆記(一),作業及附加答案連結

吳恩達機器學習筆記(一) 標籤(空格分隔): 機器學習 吳恩達機器學習筆記一 一機器學習簡介 機器學習的定義 監督學習 非監督學習

Coursera--機器學習-第七週-程式設計作業: Support Vector Machines

本次文章內容: Coursera吳恩達機器學習課程,第七週程式設計作業。程式語言是Matlab。 本文只是從程式碼結構上做的小筆記,更復雜的推導不在這裡。演算法分兩部分進行理解,第一部分是根據code對演算法進行綜述,第二部分是程式碼。 本次作業分兩個part,第一個是using SVM,第

機器學習 | 機器學習第四周程式設計作業(Python版本)

實驗指導書       下載密碼:u8dl 本篇部落格主要講解,吳恩達機器學習第四周的程式設計作業,作業內容主要是對手寫數字進行識別,是一個十分類問題,要求使用兩種不同的方法實現:一是用之前講過的邏輯迴歸實現手寫數字識別,二是用本週講的神經網路實現手寫數字

機器學習 第四周程式設計作業

lrCostFunction function [J, grad] = lrCostFunction(theta, X, y, lambda) %LRCOSTFUNCTION Compute cost and gradient for logistic regression with %reg

機器學習 | 機器學習第二週程式設計作業(Python

實驗指導書   下載密碼:hso0 本篇部落格主要講解,吳恩達機器學習第二週的程式設計作業,作業內容主要是實現單元/多元線性迴歸演算法。實驗的原始版本是用Matlab實現的,本篇部落格主要用Python來實現。   目錄 1.實驗包含的檔案 2.單元

機器學習 | 機器學習第三週程式設計作業(Python)

實驗指導書  下載密碼:fja4 本篇部落格主要講解,吳恩達機器學習第三週的程式設計作業,作業內容主要是利用邏輯迴歸演算法(正則化)進行二分類。實驗的原始版本是用Matlab實現的,本篇部落格主要用Python來實現。   目錄 1.實驗包含的檔案 2.使用邏

機器學習 ex1

clear ; close all; clc %初始化 fprintf('Running warmUpExercise ... \n'); fprintf('5x5 Identity Matrix: \n'); warmUpExercise() fprintf('Progr

機器學習 | 機器學習第八週程式設計作業(Python

實驗指導書   下載密碼:higl 本篇部落格主要講解,吳恩達機器學習第八週的程式設計作業,主要包含KMeans實驗和PCA實驗兩部分。原始實驗使用Matlab實現,本篇部落格提供Python版本。 目錄 1.實驗包含的檔案 2.KMeans實驗 3.K-me