1. 程式人生 > >【Stanford|斯坦福-機器學習:線性迴歸-單特徵梯度下降+動態圖】python3實現

【Stanford|斯坦福-機器學習:線性迴歸-單特徵梯度下降+動態圖】python3實現

五、完整測試程式碼實現

# coding=utf-8
# 線性迴歸-單特徵梯度下降練習
from numpy import *
import matplotlib.pyplot as plt
from matplotlib import animation
import numpy as np


# 【1】特徵縮放 X:=[X-mean(X)]/std(X) || X:=[X-min(X)]/max(X)-min(X) ;
def feature_scaling(data_set):
    # 特徵縮放參數
    max_value = data_set.max(0)
    min_value = data_set.min(0)
    # avg_value = (min_value + max_value)/2
    diff_value = max_value - min_value
    norm_data_set = zeros(shape(data_set))  # 初始化與data_set結構一樣的零array
    m = data_set.shape[0]
    norm_data_set = data_set - tile(min_value, (m, 1))  # avg_value
    norm_data_set = norm_data_set/tile(diff_value, (m, 1))
    return norm_data_set, diff_value, min_value


# def hy(theta, x_sample):
#      # hypothsis = theta0 + theta1 * x1 + theta2 * x2 .....
#     temp = [thetai * xi for thetai, xi in zip(theta, x_sample)]
#     result = sum(temp)
#     return result
def create_hy(θ1, θ0):
    return lambda xi: θ1*xi + θ0


# 【2】梯度下降  hypothsis = theta0 + theta1 * x1 + theta2 * x2 .....
# α=0.001 0.01 0.03 0.1 0.3 1 3 10
def step_gradient(xa, ya, α=0.001, variance=0.00001):
    # init the parameters to zero
    θ0_temp = θ1_temp = 1.
    θ0_last = θ1_last = 100.
    reduction = 1
    # 迴圈
    while reduction > variance:
        hypothesis = create_hy(θ1_temp, θ0_temp)
        m = len(xa)
        # 計算θ0、θ1
        θ0_temp -= α * (1./2) * sum([hypothesis(xa[i]) - ya[i] for i in range(m)])
        θ1_temp -= α * (1./2) * sum([(hypothesis(xa[i]) - ya[i]) * xa[i] for i in range(m)])
        # 儲存梯度下降過程theta0,theta1
        theta.append((θ0_temp, θ1_temp))
        # 畫線
        reduction = min(abs(θ0_temp - θ0_last), abs(θ1_temp - θ1_last))
        θ0_last = θ0_temp
        θ1_last = θ1_temp
    return θ0_temp, θ1_temp, theta

# 主方法
if __name__ == "__main__":
    # 開啟訓練集檔案
    f = open(r"F:\Users\Share\python\data.csv", "r")
    rows = f.readlines()
    # 設訓練集為房屋價格
    x1 = []  # 房屋大小 平方米 x∈(25,71) avg=48
    y1 = []  # 房屋價格 萬 y∈(30,120) avg=75
    # 轉列表儲存
    for row in [value.split(",") for value in rows]:
        x1.append(float(row[0]))
        y1.append(float(row[1]))
    # 關閉開啟的檔案
    f.close()
    # 特徵縮放
    # x, y = feature_scaling1(x1, y1)
    x, diff_x, min_x = feature_scaling(np.array(x1))
    y, diff_y, min_y = feature_scaling(np.array(y1))
    theta = []

    # 線性迴歸:單特徵梯度下降
    t0, t1, thetaArr = step_gradient(x.tolist()[0], y.tolist()[0])
    print("Final result: theta0_guess:%f theta1_guess:%f" % (t0, t1))
    # 繪圖
    fig = plt.figure()
    # ax = plt.axes(xlim=(-0.6, 0.6), ylim=(-0.6, 0.6))
    ax = plt.axes(xlim=(-0.5, 1.5), ylim=(-0.5, 1.2))
    line, = ax.plot([], [],  color='m', linewidth=2)
    label = ax.text([], [], '')

    # 初始化動畫節點
    def init():
        line.set_data([], [])
        plt.plot(x, y, 'bo')
        plt.title('house detail')
        plt.xlabel('size')
        plt.ylabel('price')
        return line

    xx = [-0.55, 0.0, 0.34, 0.78]  # 畫線點

    # 動畫迴圈
    def animate(i):
        global ax, line, label
        yy = []
        θ = thetaArr[i]
        for xxi in xx:
            yy.append(θ[0]+xxi*θ[1])
        line.set_data(xx, yy)
        label.set_position([θ[0], θ[1]])
        return line, label

    # animation動態記錄
    anim = animation.FuncAnimation(fig, animate, init_func=init, frames=len(theta), interval=1000, repeat=True)
    # 要儲存gif 調小frames引數
    anim.save('D:\MeetYou\Learning\MachineLearning\GradientDescent\GradientDescent.gif'
              , writer='imagemagick', fps=1)
    plt.show()

總結:

從以上python實現示例可以看出:
  1. 批梯度下降的收斂速度會比較慢
  2. 必要的特徵縮放;
  3. 必要的animation動圖,讓你更瞭解梯度下降過程。

--------------------------------------------我是分割線-------------------------------------------- 高峰屹立,積跬步,行不止。

相關推薦

Stanford|斯坦福-機器學習:線性迴歸-特徵梯度下降+動態python3實現

五、完整測試程式碼實現 # coding=utf-8 # 線性迴歸-單特徵梯度下降練習 from numpy import * import matplotlib.pyplot as plt from matplotlib import animation import numpy as np # 【1

機器學習實戰-kNN:約會網站約友分類python3實現-書本知識2

# coding=utf-8 # kNN-約會網站約友分類 from numpy import * import matplotlib.pyplot as plt import matplotlib.font_manager as font import operator # 【1】獲取資料 def in

Stanford機器學習課程(Andrew Ng) Week 1 Parameter Learning --- 線性迴歸中的梯度下降

本節將梯度下降與代價函式結合,並擬合到線性迴歸的函式中 這是我們上兩節課得到的函式,包括: 梯度下降的公式 用於擬合的線性假設和h(x) 平方誤差代價函式 J

機器學習--線性單元迴歸--變數梯度下降實現

## 機器學習--線性單元迴歸--單變數梯度下降的實現 ### 【線性迴歸】 ```text 如果要用一句話來解釋線性迴歸是什麼的話,那麼我的理解是這樣子的: **線性迴歸,是從大量的資料中找出最優的線性(y=ax+b)擬合函式,通過資料確定函式中的未知引數,進而進行後續操作(預測) **迴歸的概念是從統

Windons10 python3.6 機器學習線性迴歸 matplotlib出現影象中文亂碼和使用sk_learn輸出ValueError: Expected 2D array, got 1D

Windons10 python3.6 機器學習線性迴歸 matplotlib出現影象中文亂碼和使用sk_learn輸出ValueError: Expected 2D array, got 1D array instead:問題解決 話不多說,大家來就是解決問題的,本人也是遇到問題才四處搜尋

機器學習-線性迴歸(LMS Algorithm)

今天正式開始機器學習之路(看的斯坦福大學的視訊課以及講義),由於看的時候濛濛的,因此想要找個平臺儲存一下自己學習的成果,因此寫了此篇文章,作為機器學習的小白,文章可能有諸多不妥之處,不作為學術理論的深入研究範圍。因為我是小白,我是小白,我是小白。 由於第一次用簡書寫,所以可能格式不太對,請見諒。

機器學習 --- 線性迴歸與邏輯迴歸

線性迴歸和邏輯迴歸在機器學習上是一種監督式學習。在預測類問題上,我們希望能通過一個對映關係  ,當給定變數  ,能得到一個較為滿意的預測結果  ,迴歸方法旨在找到能表示樣本空間分佈的對映關係。   一、線性迴歸的基本形式

機器學習--線性迴歸演算法預測房價

裡面非常詳細地介紹了微積分基本運演算法則、線性迴歸演算法、梯度下降演算法及改進。 a. 用線性迴歸方法擬合正弦函式 %matplotlib inline import matplotlib.pyplot as plt import numpy as np # 生成2

機器學習——線性迴歸

1 def test_fj(): 2 X = np.array([[500, 3, 0.3], [1000, 1, 0.6], [750, 2, 0.3], [600, 5, 0.2], [1200, 1, 0.6]], dtype=float) 3 Y = np.array([100

機器學習-線性迴歸(LMS Algorithm)

今天正式開始機器學習之路(看的斯坦福大學的視訊課以及講義),由於看的時候濛濛的,因此想要找個平臺儲存一下自己學習的成果,因此寫了此篇文章,作為機器學習的小白,文章可能有諸多不妥之處,不作為學術理論的深入研究範圍。因為我是小白,我是小白,我是小白。 由於第一次用簡書寫,所以可

機器學習-線性迴歸

本文參考吳恩達機器學習課程第2章 線性迴歸公式: f(x)=θ0+θ1xf(x)=\theta_0 + \theta_1xf(x)=θ0​+θ1​x 代價公式(誤差均值中的2用來抵消求導得來的2): J(θ0,θ1)=12m∑i=1m(fθ(x)i−yi)2J(

機器學習--線性迴歸1(一元線性迴歸、多元線性迴歸,誤差性質)

前面幾節都是監督學習方面的演算法,監督學習是指有目標變數或預測目標的機器學習方法,迴歸與分類的不同,就在於其目標變數是連續數值型,而分類的目標變數是標稱型資料,其實前面的Logistic迴歸就是迴歸的一種,他們的處理方法大同小異,在這裡系統的講解一下回歸的來龍去脈,理解影響迴

機器學習----線性迴歸原理---最下二乘法和梯度下降怎麼來的-----專案預測大學生是否被錄取程式碼案例

  這節課說明了 最下二乘法  是怎麼來的。   接下來是面試需要問的 誤差,(機器學習是建立在獨立同分布的基礎上,事實上,根本無法證明獨立同分布而且是正態分佈,我們假設的,只要模型可用,就可以) 獨立:   每個人的

機器學習|線性迴歸三大評價指標實現『MAE, MSE, MAPE』(Python語言描述)

對於迴歸預測結果,通常會有平均絕對誤差、平均絕對百分比誤差、均方誤差等多個指標進行評價。這裡,我們先介紹最常用的3個: 平均絕對誤差(MAE) 就是絕對誤差的平均值,它的計算公式如下: M

機器學習 -- 線性迴歸和邏輯迴歸的區別

  迴歸演算法是一種通過最小化預測值與實際結果值之間的差距,而得到輸入特徵之間的最佳組合方式的一類演算法。對於連續值預測有線性迴歸等,而對於離散值/類別預測,我們也可以把邏輯迴歸等也視作迴歸演算法的一種。    線性迴歸與邏輯迴歸是機器學習中比較基礎又很常用的內容。線性迴歸主

機器學習 線性迴歸 (matlab實現)

代價函式:下降梯度:假設函式:x代表年齡,y代表身高預測身高與年齡的關係Code:x = load('ex2x.dat'); y = load('ex2y.dat'); [m,n] = size(x); x = [ones(m,1),x];%偏置項 x0 = 1 figur

K-means聚類與PCACoursera 斯坦福 機器學習

本文基於Coursera 斯坦福吳恩達機器學習課程謝絕任何不標記出處的轉載如有問題請聯絡作者所有非手畫影象(除公式)均來自課程侵刪————————————————————————————————————————————————1. 無監督學習簡介 unsupervised l

機器學習--線性迴歸R語言

迴歸分析就是利用樣本,產生擬合方程,從而進行預測。簡而言之,就是你用你手頭上的資料進行模型的訓練,然後用你得到的模型對於新資料進行預測。 一元線性迴歸: 例子: y<- c(61,57,58,40,90,35,68)#weight x&l

機器學習線性迴歸中,用矩陣求導方法求最小二乘法的方法

在我們推導最小二乘法的時候,Andrew提供了兩種方法,一個是梯度下降法則,另一個是矩陣求導法則。後來在《機器學習實戰裡》面看線性迴歸程式碼的時候,裡面就是用了矩陣求導法則。要看懂矩陣求導法則,是需要一些矩陣論的知識的,還記得今年夏天我在苦逼地到處求矩陣論地速成

機器學習演算法入門之(一) 梯度下降實現線性迴歸

1. 背景 線性迴歸的目標很簡單,就是用一條線,來擬合這些點,並且使得點集與擬合函式間的誤差最小。如果這個函式曲線是一條直線,那就被稱為線性迴歸,如果曲線是一條二次曲線,就被稱為二次迴歸。資料來自於GradientDescentExample中的data.