線性回歸、梯度下降(Linear Regression、Gradient Descent)

轉載請注明出自BYRans博客:http://www.cnblogs.com/BYRans/

?

實例

??? 首先舉個例子,假設我們有一個二手房交易記錄的數據集,已知房屋面積、臥室數量和房屋的交易價格,如下表:

???

??? 假如有一個房子要賣,我們希望通過上表中的數據估算這個房子的價格。這個問題就是典型的回歸問題,這邊文章主要講回歸中的線性回歸問題。

?

線性回歸(Linear Regression)

??? 首先要明白什么是回歸。回歸的目的是通過幾個已知數據來預測另一個數值型數據的目標值。假設特征和結果滿足線性關系,即滿足一個計算公式h(x),這個公式的自變量就是已知的數據x,函數值h(x)就是要預測的目標值。這一計算公式稱為回歸方程,得到這個方程的過程就稱為回歸。

??? 線性回歸就是假設這個方式是一個線性方程,即假設這個方程是一個多元一次方程。以咱們上面提到的例子為例:假設房子的房屋面積和臥室數量為自變量x,用x1表示房屋面積,x2表示臥室數量;房屋的交易價格為因變量y,我們用h(x)來表示y。假設房屋面積、臥室數量與房屋的交易價格是線性關系。他們滿足公式

???

??? 上述公式中的θ為參數,也稱為權重,可以理解為x1和x2對h(x)的影響度。對這個公式稍作變化就是

???

??? 公式中θ和x是向量,n是樣本數。

??? 假如我們依據這個公式來預測h(x),公式中的x是我們已知的,然而θ的取值卻不知道,只要我們把θ的取值求解出來,我們就可以依據這個公式來做預測了。

??? 那么如何依據訓練數據求解θ的最優取值呢?這就牽扯到另外一個概念:損失函數(Loss Function)。

?

損失函數(Loss Function

??? 我們要做的是依據我們的訓練集,選取最優的θ,在我們的訓練集中讓h(x)盡可能接近真實的值。h(x)和真實的值之間的差距,我們定義了一個函數來描述這個差距,這個函數稱為損失函數,表達式如下:

??? 這里的這個損失函數就是著名的最小二乘損失函數,這里還涉及一個概念叫最小二乘法,這里不再展開了。

??? 我們要選擇最優的θ,使得h(x)最近進真實值。這個問題就轉化為求解最優的θ,使損失函數J(θ)取最小值。那么如何解決這個轉化后的問題呢?這又牽扯到一個概念:梯度下降(Radient Descent)

最小均方算法(Least mean square,LMS算法)

(對的朋友,你沒有看錯,不是梯度下降,是LMS算法。耐心點,梯度下降一會兒就出來了)

我們先來看當訓練樣本只有一個的時候的情況,然后再將訓練樣本擴大到多個的情況。訓練樣本只有一個的情況,我們借鑒LMS算法的思想。擴大到多個我們稍后說。

??? 我們要求解使得J(θ)最小的θ值,LMS算法大概的思路是:我們首先隨便給θ一個初始化的值,然后改變θ值讓J(θ)的取值變小,不斷重復改變θ使J(θ)變小的過程直至J(θ)約等于最小值。

??? 首先我們給θ一個初試值,然后向著讓J(θ)變化最大的方向更新θ的取值,如此迭代。公式如下:

???

??? 公式中α稱為步長(learning rate),它控制θ每次向J(θ)變小的方向迭代時的變化幅度。J(θ)對θ的偏導表示J(θ)變化最大的方向。由于求的是極小值,因此梯度方向是偏導數的反方向。求解一下這個偏導,過程如下:

???

??? 那么θ的迭代公式就變為:

???

??? 這是當訓練集只有一個樣本時的數學表達。我們又兩種方式將只有一個樣本的數學表達轉化為樣本為多個的情況:梯度下降(gradient descent)正則方程(The normal equations)。這里我們重點講梯度下降。

?

梯度下降

  • 批梯度下降(batch gradient descent)

??? 如下公式是處理一個樣本的表達式:

???

??? 轉化為處理多個樣本就是如下表達:

???

??? 這種新的表達式每一步都是計算的全部訓練集的數據,所以稱之為批梯度下降(batch gradient descent)

??? 注意,梯度下降可能得到局部最,但在優化問題里我們已經證明線性回歸只有一個最優點,因為損失函數J(θ)是一個二次的凸函數,不會產生局部最優的情況。(假設學習步長α不是特別大)

??? 批梯度下降的算法執行過程如下圖:

???

?

??? 大家仔細看批梯度下降的數學表達式,每次迭代的時候都要對所有數據集樣本計算求和,計算量就會很大,尤其是訓練數據集特別大的情況。那有沒有計算量較小,而且效果也不錯的方法呢?有!這就是:隨機梯度下降(Stochastic Gradient Descent, SGD)

?

  • 隨機梯度下降(Stochastic Gradient Descent, SGD)

??? 隨機梯度下降在計算下降最快的方向時時隨機選一個數據進行計算,而不是掃描全部訓練數據集,這樣就加了迭代速度。隨機梯度下降并不是沿著J(θ)下降最快的方向收斂,而是震蕩的方式趨向極小點。余凱教授在龍星計劃課程中用“曲線救國”來比喻隨機梯度下降。

??? 隨機梯度下降表達式如下:

??? clip_image001

??? 執行過程如下圖:

???

??? 批梯度下降和隨機梯度下降在三維圖上對比如下:

???

?

總結

??? 線性回歸是回歸問題中的一種,線性回歸假設目標值與特征之間線性相關,即滿足一個多元一次方程。使用最小二乘法構建損失函數,用梯度下降來求解損失函數最小時的θ值。

轉載于:https://www.cnblogs.com/BYRans/p/4700202.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374704.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374704.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374704.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣35. 搜索插入位置

給定一個排序數組和一個目標值,在數組中找到目標值,并返回其索引。如果目標值不存在于數組中,返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法。 二分搜索法 class Solution {public int searchInsert(int[] nums…

@Resource和@Autowired作用和區別

區別: 1,Resource(JSR-250標準注解,推薦使用它來代替Spring專有的Autowired注解) 2,Spring 不但支持自己定義的Autowired注解,還支持幾個由JSR-250規范定義的注解,它們分別是Resourc…

使用Oracle WebLogic對應用程序外部的EJB的引用

在之前的文章中,我們對EJB v。3.0及其為您提供的用于構建Java EE應用程序的可移植機制進行了概述。 由于Java EE規范都是關于可移植性的,因此冒著重復自己的風險,我們經常強調EJB v。3.0規范上仍然存在最重要的可移植性限制:沒有在…

基于verilog的分頻器設計(奇偶分頻原理及其電路實現:上)

在一個數字系統中往往需要多種頻率的時鐘脈沖作為驅動源,這樣就需要對FPGA的系統時鐘(頻率太高)進行分頻。分頻器主要分為奇數分頻,偶數分頻,半整數分頻和小數分頻,在對時鐘要求不是很嚴格的FPGA系統中&…

Java判斷布爾類型是否相等

public class Solution{public static void main(String args[]){boolean x1 true;boolean x2 false;boolean x3 true;if(x1!x2){System.out.println("布爾類型變量判斷是否相等可以用!");}if(x1x3){System.out.println("布爾類型變量判斷是否相等可以用&quo…

mysql 中文亂碼解決方法

最近在.NET 項目中用EF連接mysql,插入中文數據時老是顯示亂碼,在創建表時都已將編碼指定了,但是還是出現亂碼,折騰了一陣子才發現在連接字符串里面也要加上指定編碼 Character Setutf8(serverXXXXX;user idXXXX;passwordXXXXX;Cha…

提升您的休眠引擎

是否想知道如何調整基于Hibernate的應用程序以獲得無縫的可伸縮性和最佳性能? 本文探討了基于Hibernate的應用程序的調整技術,重點是有效但文獻記載不足的調整主題,例如繼承映射,二級緩存和增強的序列標識符生成器。 它還提供了一…

力扣53. 最大子序和

給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。 思路:每個循環中,sum表示以nums[i]結尾的最大子序和,res表示目前得到的最大子序和。當循環結…

Swift中的延遲加載(懶加載)

Swift方式的延遲加載 而在Swift中,你只需一行代碼即可實現此機制: lazy var players String[]() 簡單、簡潔,直入主題。 但你得記住,你必須使用var關鍵字來定義延遲加載的屬性,不能使用let關鍵字,因為常量…

Spring,Quartz和JavaMail集成教程

Quartz是一個作業調度框架,用于調度要在指定的時間表上執行的作業。JavaMail是一個用于從Java應用程序發送/接收電子郵件的API。 Spring具有集成點,可以集成Quartz和JavaMail,從而使這些API易于使用。 讓我們創建一個小型演示應用程序&#x…

Java_Web三大框架之Hibernate操作數據庫(三)

使用Hibernate操作數據庫需要七個步驟:(1)讀取并解析配置文件Configuration conf newConfiguration().configure(); (2)讀取并解析映射信息,創建SessionFactorySessionFactory sf conf.buildSessionFacto…

android布局1

第二類:屬性值必須為id的引用名“id/id-name” 僅RelativeLayout中有效 android:layout_below 在某元素的下方 android:layout_above 在某元素的的上方 android:layout_toLeftOf 在某元素的左邊 android:layout_toRightOf 在某元素的右…

Spring MVC開發–快速教程

這是我們的JCG合作伙伴之一,來自Manoj的有關使用Spring開發Web應用程序的簡短教程, 網址為“ The Khangaonkar Report ”。 (注意:對原始帖子進行了少量編輯以提高可讀性) Spring MVC使用基于模型視圖控制器體系結構&…

spring mvc controller間跳轉 重定向 傳參

url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ 1. 需求背景 需求:spring MVC框架controller間跳轉,需重定向。有幾種情況:不帶參數跳轉,帶參數拼接url形式跳轉,帶參數不拼接參…

尋找數組的中心索引

給你一個整數數組 nums ,請計算數組的 中心下標 。 數組 中心下標 是數組的一個下標,其左側所有元素相加的和等于右側所有元素相加的和。 如果中心下標位于數組最左端,那么左側數之和視為 0 ,因為在下標的左側不存在元素。這一點…

STL sector 應用

1 #include <iostream>2 #include <string>3 #include <vector>4 #include <cstdio>5 using namespace std;6 int n;7 vector<int> pile[30];8 9 //找到a所在pile和height&#xff0c;以應用的形式返回調用者&#xff0c; 10 void find_block(in…

將Jersey與Spring整合

Spring提供了很多好處&#xff0c;并通過其依賴項注入機制&#xff0c;應用程序生命周期管理和Hibernate支持&#xff08;僅舉幾例&#xff09;促進了最佳實踐。 另外&#xff0c;當您想擁有干凈的類似于REST的服務器端JSON Api時&#xff0c;我發現Jersey非常方便。 本文簡要介…

JAVAWEB 生成excel文字在一格顯示兩位不變成#號

在用java生成excel的時候會發現這種問題&#xff0c; 如果是人家給的模板還好&#xff0c;如果不是模板&#xff0c;而是通過代碼生成的話&#xff0c; 就需要進行處理了&#xff0c; 一個小單元格&#xff0c;如果是一位的話&#xff0c;如1-9顯示沒有問題&#xff0c;一旦是兩…

力扣面試題 01.07. 旋轉矩陣

給你一幅由 N N 矩陣表示的圖像&#xff0c;其中每個像素的大小為 4 字節。請你設計一種算法&#xff0c;將圖像旋轉 90 度。 不占用額外內存空間能否做到&#xff1f; 代碼一 思路&#xff1a;對于矩陣中第 ii 行的第 jj 個元素&#xff0c;在旋轉后&#xff0c;它出現在倒數…

依賴注入–手動方式

依賴注入是一種將行為與依賴解決方案分開的技術。 用簡單的話來說&#xff0c;它允許開發人員定義具有特定功能的類&#xff0c;這些功能取決于各種協作者&#xff0c;而不必定義如何獲取對這些協作者的引用。 以此方式&#xff0c;實現了各個組件之間的解耦&#xff0c;并且通…