1. 程式人生 > >線性迴歸(linear-regression)預測演算法基本概念&C++實現

線性迴歸(linear-regression)預測演算法基本概念&C++實現

linear-regression預測演算法C++實現

機器學習領域,幾個常見的概念:
迴歸(regression)用已知樣本對未知公式引數的估計。
線性迴歸(linear regression)迴歸的一種,迴歸函式是一次函式,例如:
result=f(X,Y,Z,…)=aX+bY+cZ+…+…
  其中X,Y,Z是訓練樣本集中樣本的各個維度(feature),a,b,c是模型的未知引數。
邏輯迴歸(logistic regression)將result歸一化到[0, 1]區間,即使用一個邏輯方程將線性迴歸歸一化。

總而言之,邏輯迴歸是線性迴歸的一種,線性迴歸是迴歸的一種。

線性迴歸模型是有效的


既然邏輯迴歸是線性迴歸的一種,那麼我們重點就線性迴歸展開討論,線性迴歸的預測模型雖然是一元方程,但現實中很多應用場景符合這個模型,例如商品的價格與商品的銷量之間的關係。一般來說價格越貴則銷量越低,價格越便宜則銷量越高,於是我們就能夠用
“銷量=a*價格+b”這個模型來最大化商家的收益。
如何確定a和b的值呢,我們可以根據歷史“價格-銷售”資料,來計算最優一元模型的a和b的值。
當然,很多應用場景不能夠使用線性迴歸模型來進行預測,例如,月份和平均氣溫,平均氣溫並不隨著月份的增長呈線性增長或下降的趨勢。那麼,什麼時候可以使用線性迴歸模型呢?

線性迴歸模型的適用場景
1)可以用於預測,也可以用於分類,用於分類問題時,需要設定閾值區間,並提前知曉閾值區間與類別的對應關係
2)只適用於線性問題,可以有多個維度(feature)

如何求解線性迴歸中的維度引數
在已知樣本集set的時候,如果根據樣本集得到result=f(X,Y,Z,…)=aX+bY+cZ+…+…中的未知引數a,b,c呢?

最小二乘法
最小二乘法適用於任意多維度的線性迴歸引數求解,它可求解出一組最優a,b,c解,使得對於樣本集set中的每一個樣本data,用result=f(X,Y,Z,…)來預測樣本,預測值與實際值的方差最小。方差是我們常見的估值函式(cost function)。

梯度下降法
最小二乘法實際上只定義了估值函式是方差,真正求解a,b,c的方法是梯度下降法,這是一個列舉型的求解演算法,其演算法步驟如下:
1)使用隨機的a0, b0, c0作為初始值
2)分別求解最優a, b, c…,對於每個維度引數的求解,步驟為(以a為例):
2.1)設定a範圍的最大值與最小值
2.2)設定a計算的梯度步長(這就是它叫梯度下降法的原因)
2.3)固定其他維度引數
2.4)計算a的所有取值中,使得估值函式最小的那個a即為所求

數學上可以證明:
1)上述演算法是可以收斂的(顯而易見)
2)分別求出a,b,c的最優值,組合起來就是整體的最優值(沒這麼明顯了),這個結論是很重要的,假設樣本個數為n,計算a,b,c的演算法複雜度都是線性的O(m),這個結論讓演算法的整體複雜度是n*O(m) + n*O(m) + n*O(m),而不是[n*O(m) ]*[n*O(m)]*[n*O(m)]的關係。

為了清晰直白的用程式表達演算法的整個過程,未經過任何優化的C++實現原始碼如下,為了簡化計算,不妨設特徵只有一個,預測方程為Y=aX+b

第一部分:一維樣本,已抽象成二維平面上的點

//point
class CPoint
{
    public:
        CPoint()
        {
            m_x = 0.0;
            m_y = 0.0;
        }
 
        CPoint(double x, double y)
        {
            m_x = x;
            m_y = y;
        }
 
        double GetX() const
        {
            return m_x;
        }
 
        double GetY() const
        {
            return m_y;
        }
    private:
        double m_x;
        double m_y;
};

第二部分:演算法的實現
// one-dimensional
// Y=f(X)=aX+b
class CLinearRegression
{
public:
        // 第一步驟:初始化
        int Init(const vector< CPoint>& points)
        {
            if(points.size() == 0)
            {
                return -1;
            }
 
            m_points = points;
        }
 
        // 第二步驟:計算a和b
        int Run()
        {
            // 先將a和b取個隨機的初值,此處取了0
            m_a = 0;
            m_b = 0;
            double minCost = CaculateCost(m_a,m_b);
 
            double curCost = 0.0;
            // 先計算最優的a
            for(double a=MIN_a; a< =MAX_a; a+=INC)
            {
                curCost = CaculateCost(a,m_b);
                if(curCost< minCost)
                {
                    m_a = a;
                    minCost = curCost;
                }
            }
 
            // 再計算最優的b
            for(double b=MIN_b; b< =MAX_b; b+=INC)
            {
                curCost = CaculateCost(m_a,b);
                if(curCost< minCost)
                {
                    m_b = b;
                    minCost = curCost;
                }
            }
        }
 
        // 第三步驟:輸出結果
        int PrintResult()
        {
            printf("Y=f(X)=%lfX+(%lf)\n",m_a,m_b);
            printf("minCost=%lf\n",CaculateCost(m_a,m_b));
        }
 
private:
        // 內部函式:給定a,b,輸出當前所有樣本的預計與實際值的方差
        double CaculateCost(double a, double b)
        {
            double cost = 0.0;
            double xReal = 0.0;
            double yReal = 0.0;
            double yPredict = 0.0;
            double yDef = 0.0;
            for(uint32_t i=0;i< m_points.size();++i)
            {
                // x實際值
                xReal = m_points[i].GetX();
                // y實際值
                yReal = m_points[i].GetY();
                // y預測值
                yPredict = a*xReal + b;
 
                yDef = yPredict - yReal;
                // 累加方差
                cost += (yDef*yDef);
            }
            return cost;
        }
 
    public:
        CLinearRegression()
        {
        }
 
private:
        // a,b的取值範圍
        const static double MIN_a = -2768.0;
        const static double MAX_a = 2768.0;
        const static double MIN_b = -2768.0;
        const static double MAX_b = 2768.0;
        // 梯度遞增值
        const static double INC = 0.5;
        // a,b,樣本的儲存
        double m_a;
        double m_b;
        vector< CPoint> m_points;
};

第三部分:測試用例
#include< stdio.h>
#include< vector>
 
int main()
{
    // 構造三個點,放在y=x+1左右
    vector< CPoint> points;
    points.push_back(CPoint(-1,0));
    points.push_back(CPoint(0,1));
    points.push_back(CPoint(1,2.1));
 
    // 使用線性迴歸方法計算a和b
    CLinearRegression lr;
    lr.Init(points);
    lr.Run();
    lr.PrintResult();
 
    return 0;
}

第四部分:結果輸出
[[email protected] linear-regression]$ ./a.out
Y=f(X)=1.000000X+(1.000000)
minCost=0.010000

相關推薦

線性迴歸linear-regression預測演算法基本概念&C++實現

linear-regression預測演算法C++實現 機器學習領域,幾個常見的概念:迴歸(regression):用已知樣本對未知公式引數的估計。線性迴歸(linear regression):迴歸的一種,迴歸函式是一次函式,例如:result=f(X,Y,Z,…)=

基於Ubuntu16.04+Spark+Python的線性迴歸linear regression演算法

參考: spark+python+ubuntu環境配置: https://blog.csdn.net/konglingshneg/article/details/82491157 Building A Linear Regression with PySpark and MLl

機器學習經典演算法詳解及Python實現--線性迴歸Linear Regression演算法

(一)認識迴歸 迴歸是統計學中最有力的工具之一。機器學習監督學習演算法分為分類演算法和迴歸演算法兩種,其實就是根據類別標籤分佈型別為離散型、連續性而定義的。顧名思義,分類演算法用於離散型分佈預測,如前

機器學習實戰線性迴歸Linear Regression

目錄 0. 前言 1. 假設函式(Hypothesis) 2. 標準線性迴歸 2.1. 代價函式(Cost Function) 2.2. 梯度下降(Gradient Descent) 2.3. 特徵縮放(Feat

機器學習筆記——線性迴歸Linear Regression

線性迴歸演算法 1 簡單線性迴歸(Simple Liner Regression) 解決迴歸問題 思想簡答,容易實現 許多強大的非線性模型的基礎 結果具有很好的可解釋性 蘊含機器學習中的很多重要思想 1.1 什麼是線性迴歸演算法?

用python來實現機器學習線性迴歸linear regression

需要下載一個data:auto-mpg.data 第一步:顯示資料集圖 import pandas as pd import matplotlib.pyplot as plt columns = ["mpg","cylinders","displacement","horsepowe

機器學習之線性迴歸Linear Regression

線性學習中最基礎的迴歸之一,本文從線性迴歸的數學假設,公式推導,模型演算法以及實際程式碼執行幾方面對這一回歸進行全面的剖析~ 一:線性迴歸的數學假設 1.假設輸入的X和Y是線性關係,預測的y與X通過線性方程建立機器學習模型 2.輸入的Y和X之間滿足方程Y= θ

多項式迴歸polynomial regression轉換為線性迴歸linear regression

一、介紹 一元m次多項式迴歸方程: 二元二次多項式迴歸方程: 多元多次的多項式迴歸方程較複雜,加之實際生產生活中一元m次多項式歸回就已經能夠解決了,所以略! 對於一元m次多項式迴歸方程,令: 則該一元m次多項式就轉化為m元線性迴歸方程: 因此,用多元線性函式的迴歸

邏輯迴歸logistic regression線性迴歸linear regression

序號 邏輯迴歸 線性迴歸 模型歸類 離散選擇法模型 迴歸分析 數值型別 二元 一元或多元 公式 P(Y=1│X=x)=exp(x'β)/(1+exp(x'β)) 邏輯迴歸 Logit模型(Logit model,也譯作“評定模型”,“分類評定模型”,又作Logistic

Stanford公開課機器學習---week2-1.多變數線性迴歸 Linear Regression with multiple variable

3.多變數線性迴歸 (Linear Regression with multiple variable) 3.1 多維特徵(Multiple Features) n 代表特徵的數量 x(i)代表第 i 個訓練例項,是特徵矩陣中的第 i 行,是一個向

機器學習之單變數線性迴歸Linear Regression with One Variable

1. 模型表達(Model Representation) 我們的第一個學習演算法是線性迴歸演算法,讓我們通過一個例子來開始。這個例子用來預測住房價格,我們使用一個數據集,該資料集包含俄勒岡州波特蘭市的住房價格。在這裡,我要根據不同房屋尺寸所售出的價格,畫出我的資料集: 我們來看這個資料集,如果你有一個朋

線性迴歸linear regression)

線性迴歸(liner regression) 1、迴歸問題 迴歸問題和分類問題很相似,迴歸問題輸出的是一個標量(scalar),即輸出的是一個連續的值。 迴歸其實就是預測,根據輸入(Input)得到輸出(output)。關鍵是 如何描述輸入與輸出的關係,輸入與輸出的關係 是一種

線性迴歸logistic regression

單變數線性迴歸 本文以單變數線性迴歸為例,且變數為一次方,多變數只需要增加變數x1,x2······的個數,變數x也可以有更高的次方。 h代表假設函式 theta代表引數 x代表輸入變數 y代表標籤 J代表損失函式 目標即為通過改變引數theta的值,最小化損

Python 線性迴歸Linear Regression) - 到底什麼是 regression

背景 學習 Linear Regression in Python – Real Python,對 regression 一詞比較疑惑. 這個 linear Regression 中的 Regression 是什麼意思,字面上 Regression 是衰退的意思,線性衰退?相信理解了這個詞,對線性迴歸可能印象

Python 線性迴歸Linear Regression) 基本理解

背景 學習 Linear Regression in Python – Real Python,對線性迴歸理論上的理解做個回顧,文章是前天讀完,今天憑著記憶和理解寫一遍,再回溫更正。 線性迴歸(Linear Regression) 剛好今天聽大媽講機器學習,各種複雜高大上的演算法,其背後都是在求”擬合“。 線

線性迴歸演算法推導Linear Regression

 在現實生活中普遍存在著變數之間的關係,有確定的和非確定的。確定關係指的是變數之間可以使用函式關係式表示,還有一種是屬於非確定的(相關),比如人的身高和體重,一樣的身高體重是不一樣的。 線性迴歸:            1

斯坦福:機器學習CS229:Exercise 1: Linear Regression線性迴歸答案1

先貼程式碼,有空再根據講義,逐條講解 謝謝黃博的資料! %% Machine Learning Online Class - Exercise 1: Linear Regression % Instructions % ------------ %

PRML之線性迴歸Linear Models for Regression

囉嗦兩句,PRML這本書是基於貝葉斯思想進行相關機器學習演算法的推導和講解。書上有詳細的公司推導,故LZ不做公式方面的讀書筆記記錄,來講講演算法遞進的邏輯關係。 在開始記錄線性迴歸模型學習之前,容我們閉目獨立思考兩個問題:①什麼是機器學習?②機器學習的本質問題是什麼?這

從零單排入門機器學習:線性回歸linear regression實踐篇

class rom enter instr function ont 線性 gin 向量 線性回歸(linear regression)實踐篇 之前一段時間在coursera看了Andrew ng的機器學習的課程,感覺還不錯,算是入門了。這次打算以該課程的作業

機器學習經典算法具體解釋及Python實現--線性回歸Linear Regression算法

ica single 方便 最好的 而且 == show des fun (一)認識回歸 回歸是統計學中最有力的工具之中的一個。機器學習監督學習算法分為分類算法和回歸算法兩種,事實上就是依據類別標簽分布類型為離散型、連續性而定義的。顧名思義。分類算法用於離散型分布