其中x0我們預設為1,所以其實就是乙個一元一次函式。
這裡面的x1代表了我們的輸入,比如房價**中的房屋尺寸,h(x)其實就是給出一種**。
但是我們知道,**房價,房屋的尺寸一定不是影響房屋**的唯一變數,還有可能是地理位置,周邊建築,房屋年齡等等,所以就涉及到了我們今天要討論的問題,多變數回歸。
首先呢,我們先給出多變數回歸的**公式,就是輸入一組資料之後可以給出我們**值的函式:
這裡可能有人會問為什麼x的函式都是一次的?不能是平方,立方,log或者其他的x的變數形式麼?其實是可以的,但是為了方便我們的討論,這裡先假定為一次的,並且我們對於代價函式的求導其實是關於θ值的求導,所以x的形式對於我們的討論影響不是很大。
回歸正題,我們現在有了我們的**函式,下面我們應該關注什麼呢?沒錯,就是我們的代價函式,我們給出代價函式的定義:
其實與單變數的代價函式是一樣的,那麼我們的梯度下降演算法也很類似:
x0為1
如果你理解了單變數回歸的話,那麼多變數回歸也是簡單易懂的。
那麼我們下面來看看幾個多變數回歸的技巧:
一:特徵縮放
我們知道,所有的θ值都用著相同的步長α,但是我們的特徵為房子的尺寸(1-2000)和房間的數量(1-5),所以我們如果步長過大,就可能錯過最優點,但是如果過小,我們的尺寸的下降過程就會特別的慢,所以我們應該如何解決這個問題呢?
就需要我們的技巧-特徵縮放,我們需要將所有的特徵縮放到(-1,1)這個區間中,比如房子的尺寸,我們可以(size-1000)/1000,來獲得縮放後的值,然後再進行特度下降,這樣對於我們的代價函式可以盡快的收斂。
二:α的選擇
我們知道了步長的不同會影響我們梯度下降的效率,如何選擇乙個合適的α值呢?我們可以利用我們的軟體畫出這樣的一幅函式影象,x軸代表的是迭代的步數,y軸代表的是迭代了x步之後代價函式的函式值,正常情況下的函式影象應該如下:
一條不斷接近零收斂的影象,我們畫出影象有以下幾個好處:
首先我們可以觀察到當前步長選擇之後的梯度下降是否正常,因為如果我們的步長過長可能會出現下面的影象:
原因如上圖所示。
其次,我們還可以觀察多少步之後函式收斂,我們進而可以評估α值的選取是否優秀。其實我們也可以自動檢測函式是否收斂,只要我們規定乙個閾值,當函式的下降值小於這個值的時候,自動認為函式收斂,但是因為這個閾值選取不方便,所以我們還是利用畫圖的方式來進行判斷。
這裡可以證明只要α值足夠小,是一定可以收斂的。
我們選擇α的方法也很簡單,0.001,0.003,0.01.....
每次乘3,直到我們選擇出乙個合適的值。
三:特徵選擇
以房價**為例子,如果我們選擇房屋的寬和長作為我們的特徵去擬合我們的房價,可能最後的擬合結果並不理想,實際上我們需要使用的主要特徵是房屋的面積,也就是長*寬,所以我們可以根據實際的情況構建我們新的特徵。其次,我們觀察我們上面的影象,我們如果選擇用二次函式來 擬合我們的資料集,可能並不是很合適,因為我們直到二次函式最終還是會下降的,所以我們用三次函式來進行資料集的擬合。那麼我們如何用三次函式來擬合呢?我們可以構建兩個新的特這,面積的平方,面積的立方作為我們新的特徵,然後再進行特度下降即可,但是值得注意的是,這裡面特徵縮放會顯得尤為重要。
四:標準方程
我們如果是線性回歸的話,可以利用如下的公式直接進行求解:
為什麼要用x的轉置乘x呢?因為x矩陣不一定可逆,所以需要用這樣的方式將它變為n*n的矩陣,這樣至少可以進行逆的運算,至於這個n*n的矩陣是不是可逆我們以後再談。
其實這個式子就是由y = xθ的變換而已,裡面用了一點點小技巧,那麼我們來看看這樣做有哪些好處吧:
c 矩陣作為函式輸入變數 C 實現矩陣乘法
最近學習c 做了乙個矩陣乘法的練習。先說一下功能,輸入兩個矩陣a,b,大小自己定,換行用 表示 matlab的習慣 然後輸出a b的矩陣。首先,由於輸入的矩陣維數是隨機的,因此,我們要設計程式,手動把行和列算出來,這樣方便後續乘法運算。並且把輸入的數字提取出來,放入乙個float型陣列中,這樣我們就...
c 矩陣作為函式輸入變數 傳遞函式的表徵與描述
概述傳遞函式在以輸入 輸出為主的經典理論中有著不可替代的作用,同時在時域上,和以狀態空間為主的現代控制理論又有著許多交集。只有能夠自如地解釋相互間的聯絡,才算得上對理論的成功把握。傳遞函式的特殊情況是發生零極點對消的現象,而在資料 1 上稱發生零極點對消,意味著系統不能完全由輸入輸出模型,即不能由傳...
C 實現線性回歸(多變數)
本文主要介紹c 實現線性回歸問題,實現房價的 可以有多個變數 1 單變數 2 多變數 1 測試資料 房價的估計 2 開發工具 vim gnu linux make gdb 3 執行環境 linux,g 4.9.2 4 動態庫 libmatrix.so 自己寫的矩陣包 libmyaxis.so 自己用...