線性回歸演算法——matlab以及c/c++程序實現

線性回歸演算法是處理回歸問題的常用方法,下面就線性回歸演算法來做一個簡單的模型,通過房子的大小來預測房子售價。

第一部分 理論介紹

假設這是一份數據樣本,記錄了一個地區房子的大小與房子售價的關係,因此我們把這份數據作為線性回歸演算法的學習樣本,通過計算機的迭代學習,找出局部最優解得要假設函數的參數,使得假設函數以誤差最小的方式來擬合這份數據樣本,從而讓計算機能夠通過房子的大小合理的預測房子的售價。

現在我們可以畫出這份數據樣本的分布圖,大致可以知道這是一個線性的分布過程,而且是按一次線性方程分布的。

橫軸表示房子大小 縱軸表示房子的售價

有了學習樣本,下面來介紹一下線性回歸的學習演算法

它的基本原理是,首先通過基於訓練樣本的設定,然後經過計算機的學習演算法得到我們需要的假設函數,最後通過假設函數我們就可以得到房子大小與房子售價之間的關係函數。

下面介紹Linear Regression Model,這是一個線性回歸模型,也可以稱之為代價函數以及平方差函數

在使用這個模型之前,我們必須要先假設一個函數,也就是上式中的  ?_?? ,但是  ?_?? 是一個帶有參數的不確定函數,而學習的演算法的作用的就正是通過機器學習讓計算機通過學習演算法自己去尋找最能擬合數據樣本的參數,從而找出這個最能擬合數據樣本的假設函數。

假設函數:

從圖中可知,假設函數含有兩個參數,其實在處理複雜的問題,假設函數是可以包含幾萬個甚至上百萬個參數的,這裡為了介紹方便故採用兩個參數作為例子。

有了這個線性回歸模型和假設模型,那我們的目的是什麼呢?

我們的目的是通過學習演算法找到一個局部最優解,使得代價函數的值最小,也就是找到合適的 ??_0 , ??_1來確定假設函數來擬合數據樣本。

圖1

這是通過matlab模擬得到的 ??_0 , ??_1 在[0,1]範圍內於代價函數的模型,那麼我們下一步需要做的工作就是如何在這個模型中找到最優的 ??_0 , ??_1 使得代價函數的值最小。從圖中我們可以直觀的看出,藍色區域比較低,因此這片區域就是我們需要找的地方。那麼我們如何去讓計算機自己去尋找到最優的解呢?下面我們就來介紹梯度下降的演算法來解決如何尋找局部最優解的問題。

梯度下降演算法公式

下面就是推導之後的使用梯度下降的演算法尋找局部最優解的公式

以上就是使用線性回歸演算法處理線性問題的基本理論,接下來我們就可以用這些演算法通過matlab模擬來檢測線性回歸演算法的預測效果。

這是上述圖一的俯視圖,通過這張圖我們可以直觀的看到,通過每一次學習迭代,我們都在不斷的接近上述所說的藍色最低的區域,直到找到最低點,同時也可以看出開始迭代下降的速度越快;越接近於最低點迭代的速度越慢,這樣的特性我們分析一下梯度下降演算法的公式就知道了,這裡不多贅述。

找到最優解後,我們就可以得到我們想要的假設函數來擬合我們的數據樣本

這就是學習演算法運行之後的最終結果,可以看出通過線性回歸的演算法得到的假設函數能夠很好的擬合數據樣本!

第二部分 matlab 模擬程序以及c/c++程序

matlab程序:

x=[0 10 20 30 40 50 60 70 80]; %數據樣本ny=[15 18 22 27 29 34 40 48 55];nntheta1=0; %一次係數ntheta0=0; %常係數nnv=0.00001; %步長元素個數小於9用0.0001也行nn[row,col]=size(x); %theta初始化 初值選取對結果影響也很大,特別是theta2的選取ntheta1 = mean(y)/mean(x)ntheta0 = y(1)-theta1*x(1)nwhile 1n temp1=0;n temp0=0;n for i=1:coln temp1 = temp1 + ((y(i) - (theta1*x(i) + theta0)) * x(i));n temp0=temp0+((y(i)-(theta1*x(i)+theta0))*1);n endn old_theta1=theta1;n old_theta0=theta0;n theta1 = theta1+ v*temp1n theta0 =theta0 + v*temp0n temp1=0;n temp0=0;n %誤差n e =((old_theta1-theta1)^2+(old_theta0-theta0)^2)n if e<0.000003n f=theta1*x+theta0;n plot(x,y,r+,x,f)n break;n endnendn

c/c++程序:

#include <iostream>n#include <stdio.h>n#include<math.h>nn#define v 0.001nnint main()n{n using namespace std;n double theta0;n int i,j,k,m;n int col;n int number;n int sum_x = 0;n int sum_y = 0;n int x[100]; /*數據樣本*/n int y[100];n double theta1; /* 一次項的係數*/n //float theta0; /* 常係數 */n double e; /*誤差係數*/n double old_theta1;n double old_theta0;n printf("please input samples number :"); /*輸入樣本的個數*/n // scanf("%d",&number);n cin>>number;n printf("samples number is %dnn",number);n printf("please input samplex :"); /*樣本的輸入x*/n for(k=0;k<number;k++)n {n // scanf("%d",&x[k]);n cin>>x[k];n }n printf("n");n printf("please input sampley :"); /*輸入的樣本y*/n for(m=0;m<number;m++)n {n // scanf("%d",&y[k]);n cin>>y[m];n }n printf("n");n k=0;n m=0;n printf("x[]= ");n for(k=0;k<number;k++)n {n printf("%3d",x[k]);n }n printf("nn");n printf("y[] = ");n for(m=0;m<number;m++)n {n printf("%3d",y[m]);n }n //col = sizeof(x)/sizeof(x[0]);n col = number;n printf("nn");n printf("the training sample is : %d n",col);n for(i=0;i<col-1;i++)n {n sum_x = sum_x + x[i];n sum_y = sum_y + y[i];n }n theta1 = (double)sum_y/sum_x;n theta0 = y[0]-theta1*x[0];n while(1) /*開始迭代循環,直到找到最優解退出循環*/n {n double temp1 = 0;n double temp0 = 0;n for(j=0;j<col-1;j++)n {n temp1 = temp1 + (y[j]-(theta0 + theta1*x[j]))*x[j];n temp0 = temp0 + (y[j]-(theta0 + theta1*x[j]))*1;n }n old_theta1 = theta1;n old_theta0 = theta0;n temp1 = temp1 / col;n temp0 = temp0 / col;n theta1 = theta1 - v*temp1;n theta0 = theta0 - v*temp0;n temp0 = 0;n temp1 = 0;n //e = (pow((old_theta1-theta1),2) + pow((old_theta0 - theta0),2));n if((old_theta0-theta0<0.05)&&(old_theta1-theta1<0.05))n {n printf("the objective function is : n");n printf("f(x)= %f + %f*x",theta0,theta1);n break;n }n }n}n

可以看出c/c++跑出來的結果與上述的matlab模擬程序基本是吻合的。同時也就驗證了程序是沒有問題的,我們可以繼續再驗證一下。

可以看出最後的結果完全擬合數據樣本。

總結

我們這裡只是以兩個參數為例子,因為兩個參數正好可以通過三維的空間圖形將模型表示出來;在實際運用中其實要複雜的多,很多都是沒法可視化的,但是基本的原理是一樣的,只是處理的複雜度不一樣,同時線性回歸演算法也有各種各樣的拓展和延伸,處理不同的問題有不同的手段。因此再後續的學習生活中會進一步的補充,爭取學習的更加深入。


推薦閱讀:

為什麼 feature scaling 會使 gradient descent 的收斂更好?
機器學習筆記7 —— 編程作業1代價函數和梯度下降函數
梯度下降法快速教程 | 第三章:學習率衰減因子(decay)的原理與Python實現
為什麼梯度的負方向是局部下降最快的方向?
詳解softmax函數以及相關求導過程

TAG:机器学习 | 线性回归 | 梯度下降 |