線性迴歸(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 (一)認識回歸 回歸是統計學中最有力的工具之中的一個。機器學習監督學習算法分為分類算法和回歸算法兩種,事實上就是依據類別標簽分布類型為離散型、連續性而定義的。顧名思義。分類算法用於離散型分布