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

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

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

發現數據集中房屋大小大約是臥室數量的1000倍,當特徵相差了幾個數量級時,首先進行特徵縮放會使使用梯度下降收斂變得更快,你的任務要完成把資料集中所有資料減去減取均值後在除以標準差。

注:這裡吳恩達只對X 沒對預測價格Y做標準化(從下面的圖4:適當學習率下梯度下降收斂過程

就能看出來) 我個人感覺這樣做出來的誤差會很大 當然初學階段也就將就了

標準差是一種測量變化量的方法 在特定值的範圍內 (大多數資料點將位於正負2個標準差之中)當然還有另外一種方式來確定取值範圍 那就是通過最大值MAX-最小值MIN

請注意這些矩陣X的列對應於一個特徵

實現注意:在標準化特徵時,去儲存用於標準化的值——用於計算的均值和標偏差是很重要的。在從模型中學習引數之後我們經常想預測我們之前從來沒有見過的房加,給定一個新的X值(客廳面積和寢室數量)我們必須首先使用之前從訓練集中計算出來的均值和標準差去歸一化X

以前,你在一元迴歸上使用了梯度下降,現在唯一的不同是矩陣X多了一個特徵,假設假設函式和批量更新的梯度下降規則保持不變。你應該在computeCostMulti和gradientDescentMulti中完成程式碼實現多元線性迴歸的代價函式和梯度下降。如果你已經完成,為了確保你的程式碼支援所有數量的特徵而且能很好的向量化,你可以使用size(X,2)去找出資料集中有多少特徵。

執行注意事項:在多元的情況下,代價函式也可以寫成如下向量化的形式:

當你使用像Octave / MATLAB(Python.numpy)這樣的數字計算工具時,向量化版本是非常給力的,如果你是操作矩陣的專家,你可以向自己證明這兩種形式是等價的。

可選練習:尋找學習率

在這部分練習中,你將為資料集試測不同的學習率並找出那個收斂速度更快的。

下一階段ex1將在選中的學習率中呼叫你的gradientDescent函式進行大約50次迭代,這個函式應該能返回向量J中每一次J(θ)值的歷史記錄,在最後一次迭代後,ex1.multi指令碼將繪製迭代次數與J(θ)值的影象

如果你是在一個很好的範圍裡選擇學習率的,你繪製出的圖會很像圖4,如果你的圖表看上去完全不一樣,尤其是你的J(θ)呈爆炸型增長時,調整你的學習率然後重試一次。我們推薦你嘗試的學習率的刻度是:對上一個學習率乘以3,即(0.3、0.1、0.03、0.01等等)你可能還需要調整執行的迭代次數以幫助你看到曲線的整體走勢。

圖4:適當學習率下梯度下降收斂過程

執行注意事項:如果你選的學習率過大,J(θ)可能會爆炸性增長然後發散,導致計算機計算代價太大,在這種情況下,Octave/MATLAB會返回結果NaNs。NaN代表不是一個數字而且總是導致未定義的-1和+1的操作(看不懂這段)

Octave/MATLAB小貼士:為比較不同學習率對收斂的影響,把多個學習率跟J(θ)畫在同一幅圖中是很有幫助的,在OCTAVE/MATLAB中可以通過使用hold on命令在之間執行多次梯度下降來繪製,具體而言,如果你嘗試3個不同的α(你應該嘗試使用更多的α值)並將代價值儲存在J1 J2 J3上,你可以使用下面的命令把他們繪製在同一張圖上:plot()……

函式中的brk代表不同的顏色。

注意收斂曲線隨著學習率的變化而變化,採用一個很小的學習率你會發現梯度下降法將花費大量時間去收斂到最優值,反之大的學習率可能會不收斂甚至發散!在你發現最好的學習率後執行它,去預測一個1650平米,3個臥室的房子的價格,隨後你將使用值去檢查你的執行的正規方程。別忘了在預測過程中去做標準化處理!

在教學視訊中,你已經學到了線性迴歸的封閉解(closed-form solution)是

使用這個公式不需要進行任何特徵縮放,你就會在計算中得到一個精確解,不會像梯度下降那樣在收斂前進行迴圈迭代,完成標準方程的程式碼,使用上面公式計算θ,記住儘管你不需要縮放特徵,我們仍然需要新增“全是1”的這列作為X的第一列。

可選擇的練習:現在一旦你用這個方法找到了θ,用它來預測3間臥室1650平米的房子,你應該會發現預測出的價格和之前梯度下降法預測出的一樣。

注意:本人程式碼中通過梯度下降法得到的引數θ2<0說明隨著臥室數量增加價格反而減小 可能有點問題。-0-

執行結果:

 

程式碼:

import numpy as np
import matplotlib.pyplot as plt

def featureNormalization(X):
    AVGmu = np.mean(X, axis=0)
    SDsigma = np.std(X, axis=0, ddof=0)  # axis=0代表對列做 ddof=0代表是有偏的 (數理統計對樣本標準差的定義是ddof=1是無偏的即預設情況下分母是n-1,若是想除以n則加上ddof=0)
    xxnormal = (X - AVGmu) / SDsigma #每個樣本減去均值除以有偏標準差
    #print(AVGmu)
    # print(SDsigma)
    # print(xxnormal)
    return AVGmu,SDsigma,xxnormal

def featureNormalization2(X):#把資料對映到0~1
    max = np.max(X, axis=0)
    min = np.min(X, axis=0)  # axis=0代表對列做 ddof=0代表是有偏的 (數理統計對樣本標準差的定義是ddof=1是無偏的即預設情況下分母是n-1,若是想除以n則加上ddof=0)
    xxnormal = (X - min) / (max-min) #每個樣本減去均值除以有偏標準差
    print(max)
    print(min)
    print(xxnormal)
    return max,min,xxnormal

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.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 computeCost(X,y,theta,num):
    m = num
    result = (np.sum((np.dot(X, theta) - y) ** 2)) / (2 * m)
    return result

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

def showJValueWithInterations(costhistory1,costhistory2,costhistory3):#繪製不同學習率下代價值與迭代次數的關係圖
    plt.xlabel('Number of Iterations')
    plt.ylabel('Value of Cost')
    plt.plot(np.arange(np.size(costhistory1, 0)), costhistory1, '-b', lw=2)
    plt.plot(np.arange(np.size(costhistory2, 0)), costhistory2, '-g', lw=2)
    plt.plot(np.arange(np.size(costhistory3, 0)), costhistory3, '-r', lw=2)
    plt.show()

def predictProfitByGradientDescent(x1,x2,AVGmu,SDsgm,thetai):
  Xtest=( np.array(([x1, x2])-AVGmu)/SDsgm)
  print("樣本均值是",AVGmu)
  print("樣本標準差是",SDsgm)
  print(Xtest)
  Xtest = np.hstack((1, Xtest))  # 這是矩陣拼接的另外一個方法
  predict=np.dot(Xtest,thetai)#預測
  print("通過梯度下降法:",x1,'佔地面積',x2,'個臥室的房子預測價格是',(predict[0]))

def normalEquations(x,y):
     theta=np.dot(np.dot((np.linalg.inv(np.dot(np.transpose(x),x))),np.transpose(x)),y)
     return theta

def predictProfitBynormalEquations(x1,x2,thetai):
    Xtest = np.array([x1, x2])
    Xtest = np.hstack((1, Xtest))  # 這是矩陣拼接的另外一個方法
    predict = np.dot(Xtest, thetai)  # 預測
    print("通過正規方程法",x1, '佔地面積', x2, '個臥室的房子預測價格是', (predict[0]))


#####下面都是主函式######

#####這裡都是讀取文字######
dataset = np.loadtxt('ex1data2.txt', delimiter=',')  # 讀取資料集文字
xx = dataset[:, 0:2]  # 取出文字的1 2列(房子面積、臥室數量)
yy = dataset[:, 2]  # 取出文字的第3列(錢)
num = len(xx)
#print(num) #看看有多少個數據 (有47個數據)
x = xx.reshape(num, 2)  # 轉成num行的列向量
y = yy.reshape(num, 1)  # 同上

#print(featureNormalization(x))#用於檢測
AVGmu,SDsigma,XX= featureNormalization(x)#AVGmu代表均值 SDsigma代表標準差 XX代表歸一化後的矩陣
print(AVGmu)#用於檢測
print(SDsigma)#用於檢測
#print(XX)#用於檢測標準化後的矩陣
#max,min,XX= featureNormalization2(x) #代表用最大值最小值那個方法進行歸一化
X0=np.ones((len(x), 1))#因為假設函式有常數項theta0所以考慮給實際運算的矩陣多加一列111……
juzhenXX=np.array(XX).reshape(len(XX),2)#資料集中屬性x轉換成一個n行1列的矩陣 (這行程式碼的轉換好像有點累贅)
X = np.c_[X0, juzhenXX]#把歸一化後的juzhenXX(47行2列)拼在X0(47行1列)右邊 形成一個97行3列的矩陣X
#print(X)#看看原始資料
thetainit=np.zeros((3,1))#由題設theta包含三個引數常數項theta0、一階係數theta1和theta2 後面會更新theta所以初始化是一個空矩陣 是3行1列的矩陣
print("Costfunction的初始值是",computeCost(X,y,thetainit,num))#檢視還未更新的代價函式值
studyrate=0.1#根據試探 0.01 0.03 0.1發現最好
studyrate2=0.03
studyrate3=0.01
interations=50
thetai,costhistory,thetahistory=(gradientDescent(X,y,thetainit,num,studyrate,interations))
thetai2,costhistory2,thetahistory2=(gradientDescent(X,y,thetainit,num,studyrate2,interations))
thetai3,costhistory3,thetahistory3=(gradientDescent(X,y,thetainit,num,studyrate3,interations))
#showCostfunction(interations)
print("梯度下降出來引數分別是",thetai)
showJValueWithInterations(costhistory,costhistory2,costhistory3)
predictProfitByGradientDescent(1650,3,AVGmu,SDsigma,thetai)
#下面是normal equations方法的程式碼
normalequationsjuzhenXX=np.array(x).reshape(len(x),2)
normalequationsX = np.c_[X0, normalequationsjuzhenXX]
normalequationtheta=normalEquations(normalequationsX,y)
print("正規方程出來的引數分別是",normalequationtheta)
predictProfitBynormalEquations(1650,3,normalequationtheta)

相關推薦

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

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

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

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

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

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

機器學習筆記一_單變量線性回歸

gre ima 梯度下降算法 line 公式 delta mat 所有 pan 單變量線性回歸 綱要 代價函數 梯度下降算法 全局最優與局部最優 代價函數 函數定義: \[ J(\theta_0,\theta_1,...)=\frac{1}{2m}\sum_{i=1}^

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

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

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

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

斯坦福大學() 機器學習課後習題詳解 第七週程式設計 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