1. 程式人生 > >多項式迴歸(polynomial regression)轉換為線性迴歸(linear regression)

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

一、介紹

一元m次多項式迴歸方程:


二元二次多項式迴歸方程:


多元多次的多項式迴歸方程較複雜,加之實際生產生活中一元m次多項式歸回就已經能夠解決了,所以略!

對於一元m次多項式迴歸方程,令:


則該一元m次多項式就轉化為m元線性迴歸方程:


因此,用多元線性函式的迴歸方法就可解決多項式迴歸問題!需要指出的是,在多項式迴歸分析中,檢驗迴歸係數是否顯著,實質上就是判斷自變數xi次方項對因變數y的影響是否顯著。

對於二元二次多項式迴歸方程,令:


則該二元二次多項式函式就轉化為五元線性迴歸方程:


二、一元m次多項式迴歸的最小二乘解


用矩陣表示他們的關係:


用矩陣符號表示:


此處推導過程忽略(參考線性迴歸最小二乘解的推導過程,基本過程是對每一個引數求偏導,令偏導 = 0,解聯立方程組即可),最小二乘法解:


三、Python環境下利用sklearn庫寫的簡單示例

import numpy as np
from sklearn.linear_model import LinearRegression

from sklearn.preprocessing import PolynomialFeatures
import matplotlib.pyplot as plt
# seed
rng = np.random.RandomState(123)
# construct samples. give a x, generate y with noise
def genY(x):
	a0, a1, a2, a3, e = 0.1, -0.02, 0.03, -0.04, 0.05
	yr = a0 + a1*x + a2*(x**2) + a3*(x**3) + e
	y = yr + 0.03*rng.rand(1)
	return y
# plot
plt.figure()
plt.title('polynomial regression(sklearn)')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)

x_tup = np.linspace(-1, 1, 30)
y = [genY(a) for a in x_tup]
print y
x = x_tup.reshape(-1,1)
y = np.array(y).reshape(-1,1)
plt.plot(x, y, 'k.')

qf = PolynomialFeatures(degree = 3)
qModel = LinearRegression()
qModel.fit(qf.fit_transform(x), y)
print '----'
print qf.get_params()

xp = np.linspace(-1, 2, 100)
yp = qModel.predict(qf.transform(xp.reshape(-1, 1)))

plt.plot(xp, yp, 'r-')
plt.show()

註釋:PolynomialFeatures類的成員函式fit_transform根據自變數元數和指數次數(degree)轉換成線性迴歸中的自變數,然後利用線性迴歸LinearRegression進行擬合。執行結果如下:


四、除了利用最小二乘直接解出引數的值外,也可以用梯度下降法最小化損失函式來訓練出引數的值

#-*- coding:utf-8 -*-
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

rng = np.random.RandomState(123)

def genY(x):
    a0, a1, a2, a3, e = 0.1, -0.02, 0.03, -0.04, 0.05
    yr = a0 + a1*x + a2*(x**2) + a3*(x**3) + e
    y = yr + 0.03*rng.rand(1)
    return y
    
plt.figure()
plt.title('polynomial regression(tensorflow)')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)

x = np.linspace(-1, 1, 30)
y = [genY(a) for a in x]
x = x.reshape(-1,1)
y = np.array(y).reshape(-1,1)
plt.plot(x, y, 'k.')

X = tf.placeholder('float')
Y = tf.placeholder('float')
W = tf.Variable([0.] * 4)
print W

def Model(x, w):
    terms = []
    for i in range(0, 4):
        term = tf.multiply(w[i], tf.pow(x, i))
        terms.append(term)
    rs = tf.add_n(terms)
    return rs
YModel = Model(X, W)
Cost = tf.reduce_sum(tf.square(Y - YModel))
LearnRate = 0.01
train_op = tf.train.GradientDescentOptimizer(LearnRate).minimize(Cost)

with tf.Session() as sess:
	Init = tf.global_variables_initializer()
	sess.run(Init)
	for i in range(0, 100):
		for (_x, _y) in zip(x, y):
			sess.run(train_op, feed_dict = {X: _x, Y: _y})
	print sess.run(W)

	xp = np.linspace(-1, 2, 100)
	yp = 0
	for i in range(0, 4):
		yp += sess.run(W)[i] * np.power(xp, i)

	plt.plot(xp, yp, 'g-')
	plt.show()


相關推薦

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

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

HDU3974 Assign the task多叉樹轉換線段+線段樹區間染色

結束 turn amp cas truct 沒有 遍歷 || 們的 題目大意:有n個人,給你他們的關系(老板和員工),沒有直屬上司的人就是整個公司的領導者,這意味著n個人形成一棵樹(多叉樹)。當一個人被分配工作時他會讓他的下屬也做同樣的工作(並且立即停止手頭正在做的工作),

Pandas將列表List轉換資料框Dataframe

Python中將列表轉換成為資料框有兩種情況:第一種是兩個不同列表轉換成一個數據框,第二種是一個包含不同子列表的列表轉換成為資料框。 第一種:兩個不同列表轉換成為資料框 from pandas.

SQL將用戶表中已存在的數據所有姓名漢字轉換拼音首字母

var 語句 ont htm bold varchar 實現 where into 實現方法: --函數 Create function [dbo].[fn_GetPy](@str nvarchar(4000)) returns nvarchar(4000) --

算術表達式中綴表達式轉換後綴表達式

typedef 一次 代碼 fin efault stdio.h 所有 include 得到 將後綴表達式exp轉換為postexp的過程如下: while(從exp讀取字符ch,ch!=‘\0‘) {   若ch為數字,將後繼的數字都一次存放到postexp中,並以字符‘

★ Python字串型別轉換列表型別整型資料

我們會發現在使用Matplotlib庫畫圖的時候因為許多引數都是以元組/列表的形式儲存與呼叫, 那我們可不可以通過input()輸入我們需要的引數呢? 測試過後, 發現input()輸入的是字串型別的資料,在使用list()直接對其列表化之後, 每一個單獨的字元都會被轉化列表中的

將十進位制數的ASCII碼轉換BCD碼彙編

STACK1 SEGMENT STACK       DW 256 DUP(?) STACK1 ENDS DATA SEGMENT       BUF DB 30H,30H,31H,32H DATA ENDS CODE SEGMENT &n

下劃線命名轉換駝峰命名根據介面名查詢介面檔名

見到一段程式碼實現的功能是:通過介面名驗證介面檔案是否存在。 舉個例子:介面名為:aa_bb_cc 介面檔名為 AbcAaBbCc.php 取這段程式碼稍作改造: <?php class FindFilename { /** $prefix 檔案字首 $Interfa

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

   面積與房價 訓練集 (Training Set)  Size       Price 2104       460 852         

將Outlook Email轉換JPG圖片程式碼功能只能轉當前第一頁,待優化

Sub ExportEmailAsImage() Dim objMail As Outlook.MailItem Dim strFileName As String Dim strWordDocument As String Dim objWordApp As Wor

使用Meshlab軟體將點雲Point Cloud轉換模型Mesh

使用Meshlab軟體將點雲(Point Cloud)轉換為模型(Mesh) 啟動Meshlab軟體: 匯入.ply點雲檔案: 接著點選: 彈出一個右側邊欄: 接著,計算每個點的法線: 輸入100,點選Apply,執行完成,點選Close

layui中對table中的資料進行判斷0、1轉換提示資訊

需要把“1”改成中文漢字: 在 done方法裡面進行資料渲染: layui.use('table', function(){ var table = layui.table ,form = layui.form; tab

python3 自己編寫一個程式,把大寫字母轉換小寫字母即自程式設計實現了 字串的lower()方法

 #定義一個函式,可以把列表輸入的帶有大寫字母的列表,轉換為全小寫字母 #比如:輸入列表['Hello','worlD','HAHA']  ====> ['hello','world','haha'] #程式碼如下: #定義一個函式,可以把列表輸入的帶有大寫字母的列表

html2canvas 無法渲染網路圖片 JS把圖片轉換base64格式

1、canvas需要本地的圖片 2、在使用html2canvas。大多數時候想動態載入網路的圖片,可是經常在PC端能顯示圖片,到了手機端就顯示不出來了。就是因為圖片跨域的問題引起的 html2canvas不是有配置可以解決跨域了嗎(useCORS: true,allowTaint: tr

NCR字元編碼形如中国轉換漢字 in JAVA

numericcharacterreference(NCR),數字取值為目標字元的Unicodecodepoint;以「&;#」開頭的後接十進位制數字,以「&;#x」開頭的後接十六進位制數字。「中國」二字分別是Unicode字元U+4E2D和U+56FD,十六

用js將從後臺得到的時間戳毫秒數轉換想要的日期格式

得到後臺從資料庫中拿到的資料我們希望格式是                   2016年10月25日 17時37分30秒 或者 2016/10/25 17:37:30 然而我們前臺得到的卻是一段數字(時間戳,毫秒數)                 1477386

隨筆-數字任意進位制轉換十六進位制數

題目: 給定一個整數,編寫一個演算法將這個數轉換為十六進位制數。對於負整數,我們通常使用 補碼運算 方法。 注意: 十六進位制中所有字母(a-f)都必須是小寫。 十六進位制字串中不能包含多餘的前導零。如果要轉化的數為0,那麼以單個字元’0’來表示;對於其他情況,十六進位制字串

如何將一個shape10000,3072的陣列畫素點32x32轉換相應的圖片

10000行代表有10000張圖片,每一行有3072個數據,可以理解為32X32X3代表了畫素為32X32的RGB三通道彩色圖片 例如,現在要取第2張圖片  image是一個(10000,3072)的陣列 image[i]取出第i行,然後分別取出RGB的三個1024

word文件選擇題轉換excl表格

Word轉excl表格 同事在做一個批量性的工作,就是將word文件中的題目和選項,轉移到xml文件中。例項:轉: 再網上有很多將各種文件轉化的工具和例子,但是很少有將固定格式進行轉化的。 因為在這之前也是不明所以,老大直接讓寫個指令碼,本能的感覺這個指令碼不是很好寫,有危險。但是哪有害怕就不做的道理,

word文檔選擇題轉換excl表格

exc 編寫 之前 nag work Coding 實例 固定格式 save Word轉excl表格 同事在做一個批量性的工作,就是將word文檔中的題目和選項,轉移到xml文檔中。實例:轉: 再網上有很多將各種文檔轉化的工具和例子,但是很少有將固定格式進行轉化的。 因為在