国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

【機器學習:理論+實戰(zhàn)】線性回歸,你還只會調(diào)包嗎?

共 16293字,需瀏覽 33分鐘

 ·

2021-11-12 21:58

自己動手實現(xiàn)線性回歸

我們往往會用類似sklearn的linear_model模塊直接調(diào)包去使用線性回歸處理一些回歸問題,但我們絕不能只會調(diào)包!

接下來我們就用面向?qū)ο蟮姆绞剑约簩崿F(xiàn)一個線性回歸類,并且在這個過程中體會從數(shù)學公式到python代碼的美妙。

在這里我將不會講解線性回歸的原理和公式(畢竟這是python為主題的公眾號),而是聚焦于”從公式到代碼“的過程。所以如果對公式原理以及一些線性回歸的相關(guān)術(shù)語不熟悉,可以去看相關(guān)的資料充充電,這并不難,畢竟線性回歸是機器學習里最簡單直觀的算法了

簡述線性回歸模型

線性回歸就是輸入一堆數(shù)據(jù)(假設(shè)有m條,每條數(shù)據(jù)有n個屬性,也就是m行n列),結(jié)果訓練后得到模型參數(shù)(也就是線性回歸方程中與每個屬性相乘的那些值,有幾n個屬性,就有對應(yīng)的n個參數(shù))的過程。

訓練的方法有許多,我大致分兩類,一類就是正則方程,也就是直接通過解矩陣方程得到參數(shù)。另一類就是梯度下降,它又可以細分為批量梯度下降算法、隨機梯度下降算法以及小批量梯度下降算法。梯度下降更加有通用性,因為其它機器學習模型的損失函數(shù)都極其復(fù)雜,無法獲得最值的解析解,所以可以說正則方程法算是線性回歸模型的”特色“。

設(shè)計自定義的線性回歸類

初始化函數(shù):

初始化函數(shù)接收參與訓練的數(shù)據(jù)集,并且隨機設(shè)定模型參數(shù)

getNormalEquation函數(shù)

正則方程函數(shù)

BGD函數(shù)

BGD函數(shù)是梯度下降算法的函數(shù)

SGD函數(shù)

SGD函數(shù)是隨機梯度下降算法函數(shù),接收學習率這個參數(shù)

MBGD函數(shù)

MBGD函數(shù)是小批量梯度下降算法的函數(shù),接收學習率這個參數(shù)

train_BGD函數(shù)

用BGD算法訓練,接收迭代率和學習率兩個參數(shù)

train_SGD函數(shù)

用SGD算法訓練,接收迭代率和學習率兩個參數(shù)

train_MBGD函數(shù)

用MBGD算法訓練,接收迭代率和學習率兩個參數(shù)

Shuffle函數(shù)

這個函數(shù)主要用于生成與訓練數(shù)據(jù)集大小相同的隨機自然數(shù)序列。主要用于SGD函數(shù)和MBGD函數(shù)中,通過隨機數(shù)序列打亂訓練集和標簽集,消除訓練集順序?qū)GD算法和MBGD算法的影響

Cost函數(shù)

這個函數(shù)就是平均訓練的損失函數(shù),計算訓練數(shù)據(jù)集在模型參數(shù)下的預(yù)測結(jié)果與實際值之間的均方誤差。它主要用于三個迭代訓練函數(shù)中,記錄每次迭代后的誤差

predict函數(shù)

這個函數(shù)是預(yù)測函數(shù),接受一組測試數(shù)據(jù),然后結(jié)合模型參數(shù)對測試數(shù)據(jù)進行預(yù)測

test函數(shù)

這個函數(shù)和預(yù)測函數(shù)很相似,都是結(jié)合模型參數(shù)預(yù)測結(jié)果,不同的是這個函數(shù)接受的是測試數(shù)據(jù)集,它遍歷整個測試數(shù)據(jù)集,每次都調(diào)用predict函數(shù)進行預(yù)測

自定義線性回歸類的結(jié)構(gòu)

import?numpy?as?np

"""
這是一個關(guān)于線性回歸的模塊
核心部分就是LinearRegression這個類
這個類有以下幾個方法
構(gòu)造方法、根據(jù)參數(shù)計算預(yù)測值的方法、計算損失值的方法、生成隨機數(shù)序列的方法、使用批量梯度下降、隨機梯度下降、小批量隨機梯度下降更新參數(shù)的方法
"""

class?LinearRegress:

???def?__init__(self,?input_data,?real_result,?theta):
???def?Cost(self):
???def?Shuffle(self):
???def?BGD(self,alpha):
???def?SGD(self,alpha):
???def?MBGD(self,alpha,batch_size):
???def?train_BGD(self,iter,alpha):
???def?train_SGD(self,iter,alpha):
???def?train_MBGD(self,iter,batch_size,alpha):
???def?predict(self,data):
???def?test(self,test_data):

初始化函數(shù)的代碼實現(xiàn)

初始化函數(shù)__init__的參數(shù)是訓練數(shù)據(jù)集input_data、訓練結(jié)果集real_result以及參數(shù)theta。在初始化函數(shù)內(nèi),主要完成訓練數(shù)據(jù)集、結(jié)果集以及模型參數(shù)的初始化,與此同時還要遍歷每組數(shù)據(jù),并且要對數(shù)據(jù)進行拓展,也就是增加一維常數(shù)屬性1(因為線性回歸方程都是z=ax+by+c這種類似形式,c前面的系數(shù)是1) 當theta的默認值是None,如果是None,那么就用正態(tài)分布隨機給模型參數(shù)賦值,如若不是,就用theta作為模型參數(shù)

import?numpy?as?np


class?LinearRegress:

?def?__init__(self,?input_data,?real_result,?theta):
??"""
? inputData :輸入數(shù)據(jù)??(m條記錄,n個屬性,m*n)
? realResult :真實數(shù)據(jù)??(m條記錄,1個值,m*1)
? theta :線性回歸的參數(shù),也就是這個算法不斷更新迭代優(yōu)化得到的核心數(shù)據(jù)?(對應(yīng)n個屬性,n*1)
??默認為None??如果是None就用正態(tài)分布的數(shù)據(jù)來初始化參數(shù),如果不是None,就用傳進來的theta初始化參數(shù)
??"""


??#?輸入數(shù)據(jù)集的形狀
??row,?col?=?np.shape(input_data)
??#?通過輸入數(shù)據(jù)集,建立這個類里面的成員變量Data,先初始化為m個0組成的列表
??self.Data?=?[0]?*?row
??#?給m條數(shù)據(jù)中的每一條數(shù)據(jù)都添加上一個常數(shù)項1,這一步是為了與線性回歸模型中的偏置b對應(yīng)起來
??for?(index,?data)?in?enumerate(input_data):
???#?將每一條數(shù)據(jù)構(gòu)成的列表后面都追加一個1.0,并且根據(jù)序號index將它們存放到成員變量Data相應(yīng)位置中
????self.Data[index]?=?list(data).append(1.0)
??#?轉(zhuǎn)化為numpy的格式更加高效
??self.Data?=?np.array(self.Data)

??#?通過輸入的結(jié)果數(shù)據(jù)集,建立這個類中的成員變量Result
??self.Result?=?real_result

??#?如果參數(shù)不為None的時候,利用傳入的theta初始化相應(yīng)參數(shù)
??if?theta?is?not?None:
???self.Theta?=?theta
??#?不然就用正態(tài)分布的數(shù)據(jù)來初始化
??else:
???#?此處選取了(n+1*1)的數(shù)據(jù),也是為了和偏置匹配
???self.Theta?=?np.random.normal((col?+?1,?1))

輔助函數(shù)的編寫

在前面一章我們已經(jīng)提到了這個線性回歸類的函數(shù)(方法)集合,我們先來看一看一些輔助函數(shù),它們往往運用在其它的函數(shù)中,因此先對它們進行介紹。

Shuffle函數(shù)

功能:在運行SGD算法函數(shù)或者MBGD算法函數(shù)前,隨機打亂原始的數(shù)據(jù)集以及對應(yīng)的標簽集。

??def?Shuffle(self):
??????"""
??????這是在運行SGD算法或者MBGD算法之前,隨機打亂后原始數(shù)據(jù)集的函數(shù)
??????"""

??????#?首先獲得訓練集規(guī)模,之后按照規(guī)模生成自然數(shù)序列
??????length?=?len(self.InputData)
??????sequence?=?list(range(length))
??????#?利用numpy的隨機打亂函數(shù)打亂訓練數(shù)據(jù)下標
??????random_sequence?=?np.random.permutation(sequence)
??????#?返回數(shù)據(jù)集隨機打亂后的數(shù)據(jù)序列
??????return?random_sequence
Cost函數(shù)

功能:計算訓練數(shù)據(jù)集self.InputData在模型參數(shù)self.Theta下的預(yù)測結(jié)果(也就是它們之間進行矩陣的乘法)與實際值之間的均方誤差。主要運用在三種梯度下降算法函數(shù)中,記錄每次迭代訓練后的均方誤差。

??def?Cost(self):
??????"""
??????這是計算損失函數(shù)的函數(shù)
??????"""

??????#?在線性回歸里的損失函數(shù)定義為真實結(jié)果與預(yù)測結(jié)果之間的均方誤差
??????#?首先計算輸入數(shù)據(jù)的預(yù)測結(jié)果
??????predict?=?self.InputData.dot(self.Theta).T
??????#?計算真實結(jié)果與預(yù)測結(jié)果之間的均方誤差
??????cost?=?predict-self.Result.T
??????cost?=?np.average(cost**2)
??????return?cost
predict函數(shù)

功能:對輸入的測試數(shù)據(jù)(1* n+1),結(jié)合模型參數(shù)(n+1* 1),作矩陣乘法獲得預(yù)測結(jié)果

??def?predict(self,data):
??????"""
??????這是對一組測試數(shù)據(jù)預(yù)測的函數(shù)
??????:param?data:?測試數(shù)據(jù)
??????"""

??????#?對測試數(shù)據(jù)加入1維特征,以適應(yīng)矩陣乘法
??????tmp?=?[1.0]
??????tmp.extend(data)
??????data?=?np.array(tmp)
??????#?計算預(yù)測結(jié)果,計算結(jié)果形狀為(1,),為了分析數(shù)據(jù)的方便
??????#?這里只返矩陣的第一個元素
??????predict_result?=?data.dot(self.Theta)[0]
??????return?predict_result
????????
test函數(shù)

功能:循環(huán)調(diào)用predict函數(shù),遍歷整個測試數(shù)據(jù)集,m條測試數(shù)據(jù)進行預(yù)測

??def?test(self,test_data):
??????"""
??????這是對測試數(shù)據(jù)集的線性回歸預(yù)測函數(shù)
??????:param?test_data:?測試數(shù)據(jù)集
??????"""

??????#?定義預(yù)測結(jié)果數(shù)組
??????predict_result?=?[]
??????#?對測試數(shù)據(jù)進行遍歷
??????for?data?in?test_data:
??????????#?預(yù)測每組data的結(jié)果
??????????predict_result.append(self.predict(data))
??????predict_result?=?np.array(predict_result)
??????return?predict_result
train_BGD函數(shù)

利用BGD算法函數(shù)進行訓練的函數(shù),iter代表迭代的次數(shù),alpha代表學習率,也就是每次更新模型參數(shù)的幅度大小

??def?train_BGD(self,iter,alpha):
??????"""
??????這是利用BGD算法迭代優(yōu)化的函數(shù)
??????:param?iter:?迭代次數(shù)
??????:param?alpha:?學習率
??????"""

??????#?定義訓練損失數(shù)組,記錄每輪迭代的訓練數(shù)據(jù)集的損失
??????Cost?=?[]
??????#?開始進行迭代訓練
??????for?i?in?range(iter):
??????????#?利用學習率alpha,結(jié)合BGD算法對模型進行訓練
??????????self.BGD(alpha)
??????????#?記錄每次迭代的訓練損失
??????????Cost.append(self.Cost())
??????Cost?=?np.array(Cost)
??????return?Cost
train_SGD函數(shù)

利用SGD算法函數(shù)進行訓練的函數(shù),參數(shù)說明同上

??def?train_SGD(self,iter,alpha):
??????"""
??????這是利用SGD算法迭代優(yōu)化的函數(shù)
??????:param?iter:?迭代次數(shù)
??????:param?alpha:?學習率
??????"""

??????#?定義訓練損失數(shù)組,記錄每輪迭代的訓練數(shù)據(jù)集的損失
??????Cost?=?[]
??????#?開始進行迭代訓練
??????for?i?in?range(iter):
??????????#?利用學習率alpha,結(jié)合SGD算法對模型進行訓練
??????????self.SGD(alpha)
??????????#?記錄每次迭代的訓練損失
??????????Cost.append(self.Cost())
??????Cost?=?np.array(Cost)
??????return?Cost
train_MBGD函數(shù)

利用MBGD算法函數(shù)進行訓練的函數(shù),參數(shù)說明同上

??def?train_MBGD(self,iter,batch_size,alpha):
??????"""
??????這是利用MBGD算法迭代優(yōu)化的函數(shù)
??????:param?iter:?迭代次數(shù)
??????:param?batch_size:?小樣本規(guī)模
??????:param?alpha:?學習率
??????"""

??????#?定義訓練損失數(shù)組,記錄每輪迭代的訓練數(shù)據(jù)集的損失
??????Cost?=?[]
??????#?開始進行迭代訓練
??????for?i?in?range(iter):
??????????#?利用學習率alpha,結(jié)合MBGD算法對模型進行訓練
??????????self.MBGD(alpha,batch_size)
??????????#?記錄每次迭代的訓練損失
??????????Cost.append(self.Cost())
??????Cost?=?np.array(Cost)
??????return?Cost

正則方程法

所謂正則方程法就是用矩陣求導(dǎo)的方法,求取損失函數(shù)的最小值 在求導(dǎo)的過程中,會求解導(dǎo)函數(shù)等于零的方程,最終將會解得模型參數(shù)值為:訓練數(shù)據(jù)集的轉(zhuǎn)置乘以訓練數(shù)據(jù)集本身,之后對相乘結(jié)果求一個逆矩陣,再將整個逆矩陣乘以訓練數(shù)據(jù)集本身,最后與結(jié)果數(shù)據(jù)集相乘。具體的推導(dǎo)過程可以看下圖

值得注意的是,正則方程法需要保證訓練數(shù)據(jù)集的轉(zhuǎn)置乘以訓練數(shù)據(jù)集本身,記為XT*X可以求得逆矩陣,但是在實際問題中,數(shù)據(jù)集的特征數(shù)n可能會大于數(shù)據(jù)集規(guī)模m,這就導(dǎo)致了XTX不可逆。故而在實際的編程過程中,會在XTX的基礎(chǔ)上加一個很小的可逆矩陣,例如0.001E,這樣就可以保證可逆了。

??def?getNormalEquation(self):
??????"""
??????這是利用正規(guī)方程計算模型參數(shù)Thetha
??????"""

??????"""
????????0.001*np.eye(np.shape(self.InputData.T))是
????????防止出現(xiàn)原始XT的行列式為0,即防止原始XT不可逆
?????"""

??????#?獲得輸入數(shù)據(jù)數(shù)組形狀
??????col,rol?=?np.shape(self.InputData.T)
??????#?計算輸入數(shù)據(jù)矩陣的轉(zhuǎn)置
??????XT?=?self.InputData.T+0.001*np.eye(col,rol)
??????#?計算矩陣的逆
??????inv?=?np.linalg.inv(XT.dot(self.InputData))
??????#?計算模型參數(shù)Thetha
??????self.Theta?=?inv.dot(XT.dot(self.Result))

梯度下降算法

梯度下降算法是求取最值的通法,通過每次的迭代更新,逐步逼近最優(yōu)解,常用于機器學習和人工智能當中用來遞歸性地逼近最小偏差模型。

在線性回歸模型中,我們在求解損失函數(shù)的最小值時,可以通過梯度下降法來一步步的迭代求解,得到最小化的損失函數(shù)和模型參數(shù)值。

具體可分為三種:批量梯度下降算法(Batch Gradient Descent)BGD、隨機梯度下降算法(Stochastic Gradient Descent)SGD 以及 小批量梯度下降算法(Mini Batch Gradient Descent)MBGD,下面我們來依次介紹這些算法的思想以及具體的編程實現(xiàn)。

批量梯度下降算法

算法流程:每次迭代遍歷數(shù)據(jù)集時,保存每組訓練數(shù)據(jù)對應(yīng)的梯度增量,待到遍歷結(jié)束后,計算所有梯度增量之和,再與當前模型參數(shù)相加,更新模型參數(shù),重復(fù)上述過程,直到模型參數(shù)值收斂。顯然,經(jīng)過不斷的優(yōu)化迭代后,BGD算法幾乎可以收斂于全局最優(yōu)解(當然還受限于學習率這個超參數(shù),它代表模型參數(shù)更新的幅度)。

??def?BGD(self,alpha):
??????"""
??????這是利用BGD算法進行一次迭代調(diào)整參數(shù)的函數(shù)
??????:param?alpha:?學習率
??????"""

??????#?定義梯度增量數(shù)組
??????gradient_increasment?=?[]
??????#?對輸入的訓練數(shù)據(jù)及其真實結(jié)果進行依次遍歷
??????for?(input_data,real_result)?in?zip(self.InputData,self.Result):
??????????#?計算每組input_data的梯度增量,并放入梯度增量數(shù)組
??????????g?=?(real_result-input_data.dot(self.Theta))*input_data
??????????gradient_increasment.append(g)
??????#?按列計算屬性的平均梯度增量
??????avg_g?=?np.average(gradient_increasment,0)
??????#?改變平均梯度增量數(shù)組形狀
??????avg_g?=?avg_g.reshape((len(avg_g),1))
??????#?更新參數(shù)Theta
??????self.Theta?=?self.Theta?+?alpha*avg_g

BGD算法每次迭代都需要遍歷整個訓練數(shù)據(jù)集,保存每組數(shù)據(jù)對應(yīng)的梯度增量,當數(shù)據(jù)規(guī)模較大時,會帶來很大的空間開銷?;诖耍S機梯度下降算法 SGD 應(yīng)運而生!

隨機梯度下降算法

BGD算法雖然可以幾乎收斂于全局最優(yōu)解,但是開銷太大,速度慢,適應(yīng)性不強。究其原因,還是每次都要遍歷整個訓練數(shù)據(jù)集這個過程花銷太大了,所以就想到了每次就用一條數(shù)據(jù)來更新參數(shù)的方法,這就是隨機梯度下降算法!

算法流程:在規(guī)模為m的數(shù)據(jù)集中,每次取出一條,來計算對應(yīng)的模型參數(shù)梯度,每次都用這個梯度來更新模型參數(shù)。也就是說在迭代過程中更新m次。重復(fù)上述過程直到收斂,在這個過程中會先講數(shù)據(jù)集打亂。

這個算法與批量梯度下降的最大不同就是:前者需要累積整個數(shù)據(jù)集的梯度增量之和,而后再更新;而隨機梯度下降則是將每條數(shù)據(jù)產(chǎn)生的梯度增量立即更新到模型參數(shù)上。后者的空間開銷顯然要小

?def?SGD(self,alpha):
??????"""
??????這是利用SGD算法進行一次迭代調(diào)整參數(shù)的函數(shù)
??????:param?alpha:?學習率
??????"""

??????#?首先將數(shù)據(jù)集隨機打亂,減小數(shù)據(jù)集順序?qū)?shù)調(diào)優(yōu)的影響
??????shuffle_sequence?=?self.Shuffle()
??????self.InputData?=?self.InputData[shuffle_sequence]
??????self.Result?=?self.Result[shuffle_sequence]
??????#?對訓練數(shù)據(jù)集進行遍歷,利用每組訓練數(shù)據(jù)對參數(shù)進行調(diào)整
??????for?(input_data,real_result)?in?zip(self.InputData,self.Result):
??????????#?計算每組input_data的梯度增量
??????????g?=?(real_result-input_data.dot(self.Theta))*input_data
??????????#?調(diào)整每組input_data的梯度增量的形狀
??????????g?=?g.reshape((len(g),1))
??????????#?更新線性回歸模型參數(shù)
??????????self.Theta?=?self.Theta?+?alpha?*?g

然而,SGD也有其缺陷,雖然相比于BGD頻繁調(diào)整了參數(shù),加快了收斂速度,但是每次都用一條數(shù)據(jù)的梯度來更新,不能代表全體數(shù)據(jù)集的梯度方向,屬實是”以偏概全“了,屬于貪心算法,理論上不能獲得最優(yōu)解,常常只能獲得次優(yōu)解?;赟GD和BGD的優(yōu)點不同,小批量隨機梯度下降 MBGD 算法應(yīng)運而生!

小批量隨機梯度下降算法

這個算法的思想就是:首先打亂數(shù)據(jù)集順序,并且劃分為若干批小樣本,而后每次迭代后遍歷一個批次里的所有樣本,計算梯度增量平均值,據(jù)此來更新模型參數(shù)。在小批量樣本的規(guī)模足夠大的時候,小批量樣本的梯度向量平均值也近似等于整個訓練數(shù)據(jù)集的平均值了,這樣就結(jié)合了BGD的”廣泛性“和SGD的”快速性“

??def?MBGD(self,alpha,batch_size):
??????"""
??????這是利用MBGD算法進行一次迭代調(diào)整參數(shù)的函數(shù)
??????:param?alpha:?學習率
??????:param?batch_size:?小樣本規(guī)模
??????"""

??????#?首先將數(shù)據(jù)集隨機打亂,減小數(shù)據(jù)集順序?qū)?shù)調(diào)優(yōu)的影響
??????shuffle_sequence?=?self.Shuffle()
??????self.InputData?=?self.InputData[shuffle_sequence]
??????self.Result?=?self.Result[shuffle_sequence]
??????#?遍歷每個小批量樣本
??????for?start?in?np.arange(0,?len(shuffle_sequence),?batch_size):
??????????#?判斷start+batch_size是否大于數(shù)組長度,
??????????#?防止最后一組小樣本規(guī)??赡苄∮赽atch_size的情況
??????????end?=?np.min([start?+?batch_size,?len(shuffle_sequence)])
??????????#?獲取訓練小批量樣本集及其標簽
??????????mini_batch?=?shuffle_sequence[start:end]
??????????Mini_Train_Data?=?self.InputData[mini_batch]
??????????Mini_Train_Result?=?self.Result[mini_batch]
??????????#?定義梯度增量數(shù)組
??????????gradient_increasment?=?[]
??????????#?對小樣本訓練集進行遍歷,利用每個小樣本的梯度增量的平均值對模型參數(shù)進行更新
??????????for?(data,result)?in?zip(Mini_Train_Data,Mini_Train_Result):
??????????????#?計算每組input_data的梯度增量,并放入梯度增量數(shù)組
??????????????g?=?(result?-?data.dot(self.Theta))?*?data
??????????????gradient_increasment.append(g)
??????????#?按列計算每組小樣本訓練集的梯度增量的平均值,并改變其形狀
??????????avg_g?=?np.average(gradient_increasment,?0)
??????????avg_g?=?avg_g.reshape((len(avg_g),?1))
??????????#?更新模型參數(shù)theta
??????????self.Theta?=?self.Theta?+?alpha?*?avg_g

MBGD兼顧了BGD算法和SGD算法的優(yōu)點,是中庸的選擇

訓練線性回歸模型

在這個章節(jié)中,將會用sklearn內(nèi)置的波士頓房價數(shù)據(jù)集結(jié)合我們自己實現(xiàn)的線性回歸去預(yù)測波士頓郊區(qū)的房價。

波士頓房價數(shù)據(jù)集共有14個屬性,其中13個是輸入屬性,還有1個屬性是輸出屬性”房屋價格“。13個輸入屬性中的第6個屬性就是”房間數(shù)目“,結(jié)合常識,房間數(shù)目約等于面積,對房價的影響很大。為了簡化案例,我們就聚焦于”房間數(shù)目“,據(jù)此預(yù)測房屋價格。

波士頓房價數(shù)據(jù)集是很知名的數(shù)據(jù)集,如果對這個數(shù)據(jù)集的結(jié)構(gòu)不了解的同學可以去搜一下相關(guān)資料。

在本章的代碼中,會用到numpy、pandas、matplotlib以及sklearn,對這些模塊不熟悉的同學,可以去看看螞蟻老師的相關(guān)課程!

Merge函數(shù):將實驗數(shù)據(jù)轉(zhuǎn)換為結(jié)構(gòu)化數(shù)據(jù)

因為我希望將得到的實驗結(jié)果存入到excel文件中,就先定義了Merge函數(shù),將sklearn中的數(shù)據(jù)轉(zhuǎn)換為pandas的dataframe形式,方便后續(xù)操作。

def?Merge(data,col):
????"""
????這是生成DataFrame數(shù)據(jù)的函數(shù)
????:param?data:輸入數(shù)據(jù)
????:param?col:列名稱數(shù)組
????"""

????Data?=?np.array(data).T
????return?pd.DataFrame(Data,columns=col)
數(shù)據(jù)預(yù)處理

首先導(dǎo)入數(shù)據(jù)集,并且對它進行預(yù)處理,用load_boston()函數(shù)加載數(shù)據(jù)集,并且只選取第六個特征值”平均房間數(shù)目“,通過Merge生成dataframe,而后保存為excel文件。然后將改變一下訓練數(shù)據(jù)集和結(jié)果(房價)數(shù)據(jù)集的形狀,最后將這些數(shù)據(jù)集劃分為訓練集和測試集。

from?sklearn.model_selection?import?train_test_split
from?sklearn.datasets?import?load_boston
#?導(dǎo)入數(shù)據(jù)以及劃分訓練數(shù)據(jù)與測試數(shù)據(jù)
InputData,?Result?=?load_boston(return_X_y=True)
#?為了方便實驗,只取第6維特征。第6列為平均房間數(shù)目
InputData?=?np.array(InputData)[:,5]
#?保存原始數(shù)據(jù)集
Data?=?Merge([InputData,Result],['平均房間數(shù)目','房價'])
Data.to_excel('./原始數(shù)據(jù).xlsx')
#?改變數(shù)據(jù)集與真實房價數(shù)組的形狀
InputData?=?InputData.reshape((len(InputData),?1))
Result?=?np.array(Result).reshape((len(Result),?1))

#?把數(shù)據(jù)集分成訓練數(shù)據(jù)集和測試數(shù)據(jù)集
train_data,test_data,train_result,test_result?=?\
????train_test_split(InputData,Result,test_size=0.1,random_state=50)
數(shù)據(jù)可視化

我們會用到matplotlib庫,對這些數(shù)據(jù)進行可視化

import?matplotlib?as?mpl
import?matplotlib.pyplot?as?plt
#?解決Matplotlib中的中文亂碼問題,以便于后面實驗結(jié)果可視化
mpl.rcParams['font.sans-serif']?=?[u'simHei']
mpl.rcParams['axes.unicode_minus']?=?False

#?利用散點圖可視化測試數(shù)據(jù)集,并保存可視化結(jié)果
col?=?['真實房價']
plt.scatter(test_data,test_result,alpha=0.5,c='b',s=10)
plt.grid(True)
plt.legend(labels?=?col,loc='best')
plt.xlabel("房間數(shù)")
plt.ylabel("真實房價")
plt.savefig("./測試集可視化.jpg",bbox_inches='tight')
plt.show()
plt.close()
構(gòu)建模型

首先,隨機生成模型參數(shù),而后將訓練數(shù)據(jù)和模型參數(shù),引入我們的線性回歸類,將訓練數(shù)據(jù)和模型參數(shù)傳入我們寫好的線性回歸對象中,每一種算法都實例化出一個對象。

from?LinearRegression.LinearRegression?import?LinearRegress
#?開始構(gòu)建線性回歸模型
col?=?np.shape(train_data)[1]+1
#?初始化線性回歸參數(shù)theta
theta?=?np.random.random((col,1))
#?BGD優(yōu)化的線性回歸模型
linearregression_BGD?=?LinearRegression(train_data,?train_result,theta)
#?SGD優(yōu)化的線性回歸模型
linearregression_SGD?=?LinearRegression(train_data,?train_result,theta)
#?MBGD優(yōu)化的線性回歸模型
linearregression_MBGD?=?LinearRegression(train_data,?train_result,theta)
#?正則方程優(yōu)化的線性回歸模型
linearregression_NormalEquation?=?LinearRegression(train_data,?train_result,theta)

之后設(shè)定迭代次數(shù)、學習率、小批量樣本個數(shù)這些超參數(shù),并且傳入相應(yīng)的對象中

#?訓練模型
iter?=?30000?????????????#?迭代次數(shù)
alpha?=?0.001????????????#?學習率
batch_size?=?64??????????#?小樣本規(guī)模
#?BGD的訓練損失
BGD_train_cost?=?linearregression_BGD.train_BGD(iter,alpha)
#?SGD的訓練損失
SGD_train_cost?=?linearregression_SGD.train_SGD(iter,alpha)
#?MBGD的訓練損失
MBGD_train_cost?=?linearregression_MBGD.train_MBGD(iter,batch_size,alpha)
#?利用正規(guī)方程獲取參數(shù)
linearregression_NormalEquation.getNormalEquation()
記錄迭代訓練誤差結(jié)果并進行可視化

訓練結(jié)束后,就將訓練的結(jié)果進行可視化,觀察比較算法之間的差異,并且將這些信息保存為excel文件

#?三種梯度下降算法迭代訓練誤差結(jié)果可視化,并保存可視化結(jié)果
col?=?['BGD','SGD','MBGD']
iter?=?np.arange(iter)
plt.plot(iter,?BGD_train_cost,?'r-.')
plt.plot(iter,?SGD_train_cost,?'b-')
plt.plot(iter,?MBGD_train_cost,?'k--')
plt.grid(True)
plt.xlabel("迭代次數(shù)")
plt.ylabel("平均訓練損失")
plt.legend(labels?=?col,loc?=?'best')
plt.savefig("./三種梯度算法的平均訓練損失.jpg",bbox_inches='tight')
plt.show()
plt.close()

#?三種梯度下降算法的訓練損失
#?整合三種梯度下降算法的訓練損失到DataFrame
train_cost?=?[BGD_train_cost,SGD_train_cost,MBGD_train_cost]
train_cost?=?Merge(train_cost,col)
#?保存三種梯度下降算法的訓練損失及其統(tǒng)計信息
train_cost.to_excel("./三種梯度下降算法的訓練訓練損失.xlsx")
train_cost.describe().to_excel("./三種梯度下降算法的訓練訓練損失統(tǒng)計.xlsx")
用訓練好的模型擬合曲線

計算4種算法訓練的線性回歸模型的擬合曲線,并可視化

#?計算4種調(diào)優(yōu)算法下的擬合曲線
x?=?np.arange(int(np.min(test_data)),?int(np.max(test_data)+1))
x?=?x.reshape((len(x),1))
#?BGD算法的擬合曲線
BGD?=?linearregression_BGD.test(x)
#?SGD算法的擬合曲線
SGD?=?linearregression_SGD.test(x)
#?MBGD算法的擬合曲線
MBGD?=?linearregression_MBGD.test(x)
#?正則方程的擬合曲線
NormalEquation?=?linearregression_NormalEquation.test(x)

#?4種模型的擬合直線可視化,并保存可視化結(jié)果
col?=?['BGD',?'SGD',?'MBGD',?'正則方程']
plt.plot(x,?BGD,'r-.')
plt.plot(x,?SGD,?'b-')
plt.plot(x,?MBGD,?'k--')
plt.plot(x,?NormalEquation,?'g:',)
plt.scatter(test_data,test_result,alpha=0.5,c='b',s=10)
plt.grid(True)
plt.xlabel("房間數(shù)")
plt.ylabel("預(yù)測值")
plt.legend(labels?=?col,loc?=?'best')
plt.savefig("./預(yù)測值比較.jpg",bbox_inches='tight')
plt.show()
plt.close()

對模型進行驗證

前文介紹了模型的訓練過程,那如何評判訓練好的模型效果呢?方法是用測試集了驗證模型預(yù)測值與實際值的誤差去判斷效果。

在這里,將會使用4種實例化對象的test方法得到模型的預(yù)測結(jié)果,然后使用pandas將預(yù)測結(jié)果和統(tǒng)計信息保存為excel文件

#?利用測試集進行線性回歸預(yù)測
#?BGD算法的預(yù)測結(jié)果
BGD_predict?=?linearregression_BGD.test(test_data)
#?SGD算法的預(yù)測結(jié)果
SGD_predict?=?linearregression_SGD.test(test_data)
#?MBGD算法的預(yù)測結(jié)果
MBGD_predict?=?linearregression_MBGD.test(test_data)
#?正則方程的預(yù)測結(jié)果
NormalEquation_predict?=?linearregression_NormalEquation.test(test_data)

#?保存預(yù)測數(shù)據(jù)
#?A.tolist()是將numpy.array轉(zhuǎn)化為python的list類型的函數(shù),是將A的所有元素
#?當作一個整體作為list的一個元素,因此我們只需要A.tolist()的第一個元素
data?=?[test_data.T.tolist()[0],test_result.T.tolist()[0],BGD_predict,
????????????SGD_predict,MBGD_predict,NormalEquation_predict]
col?=?["平均房間數(shù)目","真實房價",'BGD預(yù)測結(jié)果','SGD預(yù)測結(jié)果','MBGD預(yù)測結(jié)果','正規(guī)方程預(yù)測結(jié)果']
Data?=?Merge(data,col)
Data.to_excel('./測試數(shù)據(jù)與預(yù)測結(jié)果.xlsx')

#?計算4種算法的均方誤差以及其統(tǒng)計信息
#?test_result之前的形狀為(num,1),首先計算其轉(zhuǎn)置后
#?獲得其第一個元素即可
test_result?=?test_result.T[0]
#?BGD算法的均方誤差
BGD_error?=?((BGD_predict-test_result)**2)
#?SGD算法的均方誤差
SGD_error?=?((SGD_predict-test_result)**2)
#?MBGD算法的均方誤差
MBGD_error?=?((MBGD_predict-test_result)**2)
#?正則方程的均方誤差
NormalEquation_error?=?((NormalEquation_predict-test_result)**2)
#?整合四種算法的均方誤差到DataFrame
error?=?[BGD_error,SGD_error,MBGD_error,NormalEquation_error]
col?=?['BGD',?'SGD',?'MBGD',?'正則方程']
error?=?Merge(error,col)
#?保存四種均方誤差及其統(tǒng)計信息
error.to_excel("./四種算法的均方預(yù)測誤差原始數(shù)據(jù).xlsx")
error.describe().to_excel("./四種算法的均方預(yù)測誤差統(tǒng)計.xlsx")

分析本次實驗的結(jié)果

原始數(shù)據(jù)集

我們來看看原始數(shù)據(jù)集長什么樣子

可視化測試集

看表格不直觀,我們來看看其中測試集的可視化結(jié)果吧!

可以明顯看到平均房間數(shù)和房價之間存在正相關(guān)的關(guān)系

對比3種梯度下降算法在訓練過程中的平均損失
img
對3種梯度下降算法的均方誤差進行統(tǒng)計
img

顯然可以發(fā)現(xiàn),BGD算法的斂速度最慢,且在訓練結(jié)束后,BGD算法的訓練均方誤差最終在48.533,SGD的收斂速度最快(最快到達拐點),但由于貪心算法的特性(每條數(shù)據(jù)的梯度增量都作用于模型參數(shù))它會在最小值附近震蕩,而MBGD收斂速度居中,且沒有震蕩,誤差基本上都是一路下跌

這些結(jié)果和我們的前期判斷一致

驗證模型

接下來我們看看4中算法訓練出來的模型應(yīng)用在測試集的數(shù)據(jù)上是什么效果吧!

預(yù)測結(jié)果可視化
img

在上圖中,圓點代表真實數(shù)據(jù),從上到下4條線形不一的直線分別代表BGD、SGD、MBGD以及正則方程算法訓練出來的線性回歸模型的預(yù)測擬合直線。從圖中來看,除了少量離群點,絕大多數(shù)點都均勻分布在4條擬合直線的左右,大致可以判定,效果都還不錯。

預(yù)測結(jié)果量化分析

為了更好地對比4中算法的優(yōu)缺點,下圖給出測試集的預(yù)測房價與真實房價之間的均方誤差統(tǒng)計信息

可以看出來,MBGD的均方誤差在測試集上是最小的,正則方程緊隨其后,BGD第三,SGD誤差最大 再次驗證了我們之前的判斷。

總結(jié)

線性回歸是機器學習回歸問題中最簡單的模型,其模型參數(shù)通常用梯度下降和正則方程求解。在三種梯度下降算法中,BGD能近似獲得全局最優(yōu)解,穩(wěn)定性強,但是收斂速度慢;SGD則是收斂速度快,但無法獲得全局最優(yōu)解,且穩(wěn)定性欠佳;MBGD則是中庸方案。至于正則方程,則適用于大規(guī)模的數(shù)據(jù)集,但其時間復(fù)雜度較大(涉及大量矩陣相乘)。

推薦我的機器學習實戰(zhàn)課程

一個機器學習系列,從模型訓練到在線預(yù)估,到Linux線上部署,包含大量的工程細節(jié),推薦給大家我自己的機器學習實戰(zhàn)課程:

掃碼購買
《機器學習 Sklearn二手車價格預(yù)估》

課程介紹


購買后加老師微信:ant_learn_python

會提供微信答疑,拉VIP會員交流群

瀏覽 126
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 乱伦中文| 无码精品一区二区三区在线| 久久久久无码| 黄色永久网站| 69国产成人精品二区| 日本久久久久久久久视频在线观看| 日韩精品一二三| 色五月婷婷久久| 国产aaaaaaaaaaaaa| 午夜黄片| 亚洲自拍偷拍视频| 欧美v| 久草大香蕉视频| 久久亚洲日韩天天做日日做综合亚洲| 成人精品免费视频| 乱伦内射| 大骚逼影院| 国产精品自在线| 国产偷拍精品视频| 91免费观看视频| 爱搞搞就要搞搞| 二区三区免费| 操逼去| 成人肏逼视频在线| 有码中文字幕| 大香蕉伊人av| 亚洲欧美高清| 成人无码免费毛片| 你懂的在线免费观看| 败火老熟女ThePorn视频| 国产无码电影| 国产AV黄色| 国产伦精品一区二区三区视频女 | 亚洲小骚逼| 少妇高潮av久久久久久| 3级毛片| 国产欧美精品一区二区| 日本一区免费| 国产人妖TS重口系列网站观看| 69乱伦视频| 天天天天色| 亚洲无码影视| 国产做受91一片二片老头| 欧美日逼网站| 内射熟妇| 一级a片在线播放| 人人操人人爽人人爱| 五月婷婷影院| www.亚洲成人| 日本天堂在线| 久久蜜桃视频| 久久婷婷五月丁香| 天天干夜夜操| 韩日不卡视频| 狼友视频在线观看| 国产精品视频福利| 欧美激情视频一区二区| 国产精品S色| 97福利导航| 国产九色91回来了| 91精品综合| 日韩欧美精品在线观看| 波多野结衣无码一区二区| 三浦恵子一级婬片A片| 日本親子亂子倫XXXX| 日P免费视频| 无码免费观看| 中文字幕视频在线| 影音先锋成人av| jjzz国产| 午夜福利91| 国产黄色小视频在线观看| 成人自拍视频在线| 伊人网视频在线播放| 做爱视频网站18| 大乳奶一级婬片A片| 操逼的网站| 亚洲一区二区三区在线| 国产一级女婬乱免费看| 香蕉一区二区| 成人福利视频在线观看| 国产免费av在线| 日韩在线免费看| 99在线视频播放| 国产AV一区二区三区| 无码人妻丰满熟妇区毛片视频| 无码毛片一区二区三区人口| 99久久婷婷国产综合| 第四色视频| 亚洲色视频在线| 日本一级a片| 欧美特黄一级视频| 露脸丨91丨九色露脸| 婷婷六月激情| 日本综合在线| 操碰视频在线| 精品无码在线观看视频| 国产精品免费av在线| 亚洲成人在线| 黄色3A片在线观看| 久艹在线观看视频| 久久久精品一区| 国产白丝精品91爽爽久久| 亚洲AV一二三区| 日本成人电影一区二区三区| 九草在线| 狠狠躁日日躁夜夜躁A片小说免费| 丁香五月中文| 免费无码网站| 欧美aaa在线| 91亚色视频| 操欧美女人| 91在线91| 91大神在线免费看| 色男人天堂| 久久精品99| 国产精品揄拍一区二区| 操比视频| GOGO人体做爰大胆视频| 午夜天堂精品久久久久| 国产91无码网站在线观看| 国产精品你懂的| 激情五月丁香婷婷| EEUSS| 中文字幕人妻互换av久久| 欧美在线免费观看| 三级无码在线| 国产色哟哟| 亚洲毛片视频| 自拍偷拍中文字幕| 五月激情六月丁香| 黄片视频网站| 亚洲骚货| 丁香五月网| 欧美一卡二卡| 在线观看黄片| 国外成人视频| 天天日天天干麻豆| 中国无码| 国产日韩欧美成人| 国产精品国产三级国产专区52 | 一级免费A片| 思思热在线观看视频| 国产91精品在线观看| 91香蕉国产在线观看软件| 午夜电影无码| 91免费福利| 人人摸人人干人人操| 极品一区| 免费看黄色片| 日韩激情无码| 午夜黄片| 国产免费观看av| 五月婷婷性爱| 思思热在线视频精品| 91久久人澡人妻人人澡人人爽| 美女网站视频黄| 日本精品视频一区二区| 亚洲视频91| 男人av在线| 午夜骚影| 七十路の高齢熟女千代子| 国产午夜在线| 黄色毛片视频| 国产操逼片| 国产成人AV| 欧洲肥胖BBBBBBBBBB| 日韩精彩视频| 欧美a片在线看| 密桃视频网站| 久草不卡| 黑巨茎大战欧美白妞小说| 97人妻精品一区二区三区视频| 五月开心激情网| 五月综合久久| 91麻豆成人| 天堂资源| 五月影院| 啪啪啪网址| 青青草视频91| 国产三级视频在线| 一级a一级a爰片免费| 国产女人18毛片水18精| 黄色一级片免费看| 青青草手机在线视频| 国产精品视频在线观看| 日韩在线欧美在线| 国产噜噜噜噜噜久久久久久久久 | 人妻无码专区| 麻豆视频在线观看| 亚洲欧洲精品成人久久曰影片| 91精品国产乱码久久| 精品在线播放视频| 丰满人妻一区二区三区四区54| 成人v| 成人免看一级a一片A片| 翔田千里AV在线| 午夜激情av| 北条麻妃一区二区三区-免费免费高清观看 | 制服丝袜在线视频| 日韩欧美在线不卡| 俺也去啦WWW色官网| 日本天堂网| 国产又爽又黄免费视频网站| 麻豆91精品91久久久停运原因| 成人综合大香蕉| 欧美国产第一页| 97超级碰| 99在线视频精品| 日韩一二区| 最美孕交vivoestv另类| 国产一精品一aⅴ一免费| 日本道在线视频| 成人电影无码| A级片在线观看| 日韩精品免费| 久久精品99视频| 国产午夜成人视频| 夜夜骚av.一区二区三区四区| 99热在线只有精品| 青娱乐网| 秋霞午夜成人无码精品| 成人A电影| 日本无码毛片| 骚逼黄片| 超碰人人射| 三级片视频网站| 18成人毛片| 伊人激情五月| 日韩黄色在线视频| 亚洲AV永久无码精品| 国精产品乱码一区一区三区四区| 三级黄片免费看| 日本免费色视频| 国产色情视频在线观看| 99热99精品| 日韩在线视频免费观看| www国产| 精品素人在线| 欧美a片在线观看| 日逼综合网| 德美日三级片在线观看| 国产亚洲婷婷| 国产AV播放| 国产精品视频福利| 国产一级a毛一级a| 久草三级片| 高清中文字幕在线A片| 九色PORNY蝌蚪自拍视频| 伊人婷婷| 亚日韩视频| 91社区成人影院| 欧美在线视频一区| 亚洲精品国产精品国自产在线| 佳佳女王footjob超级爽| 超碰在线观看免费版| 成人做爰黄A片免费视频网站野外| 色色毛片| 亚洲猛男操逼欧美国产视频| 国内自拍欧美| 三级午夜在线无码| 欧美精品秘一区二区三区蜜臀| 成人小视频十八禁免费观看| 69色色| 亚洲日韩精品在线观看| 深爱五月婷婷| 国产精品外围| 蜜桃视频com.www| 亚洲日韩视频在线| 亚洲日本中文字幕| 东京热一级片| 日本少妇做爱| 尤物视频网址| 国产精品一级二级三级| 国产一级二级三级片| 操骚屄视频| 欧美日韩一| 中文字幕在线播放av| www.插插| 亚洲人妻在线视频| 91爱看| 一级黄色录像视频| 一级黄色电影在线观看| 懂色成人视频在线观看| 人操人碰| 中文字幕高清在线| 97人妻| 成人H视频| 最近中文字幕免费mv第一季歌词大全 | 久久久久久一区| 黄色免费在线网站| 自拍偷拍无码| A级黄色网| 久久久久久久久久国产精品| 亚洲中文字幕视频在线观看| 久久嫩草精品久久久久精| 国产精品成人在线视频| 天天综合网久久综合网| 久久精品在线观看| 亚洲黑人av| 中文字幕亚洲高清| 国产a区| 一级A毛片| 国产精品在线观看视频| 日本不卡视频| 国产网站视频| 国产AV不卡| 日韩中文毛片| 最近最经典中文MV字幕| 国产一区二区三区免费播放| 欧美特级黄片| av婷婷五月天| 污视频在线免费观看| 欧美三级在线观看视频| 自拍偷拍av| 三级片自拍| 久久AV电影| 亲子伦一区二区三区| 久久人妻免费视频| 一区二区无码av| 欧美三P囗交做爰XXXⅩ| 自拍一区在线观看| 天堂8在线| 无码日逼| 午夜福利无码电影| 精品999| 伊人春色网| 色婷婷老师| 91AV在线看| 国产三级片视频在线观看| 欧美三级网站在线观看| 中文字幕A片无码免费看| 波多野结衣无码AV专区| 亚洲图片欧美另类| 精品中文字幕在线播放| 夜夜操夜夜| 特级WWW444至码| 亚洲婷婷精品国产成人| 人人摸人人色| 亚洲精品97| 男人天堂大香蕉| 刘玥91精品一区二区三区| www在线视频| 日韩久久免费视频| 五月婷婷性爱| 成人三级毛片| 亚洲福利女神成人福利| 成熟的国模冰莲[2]| 2025国产精品| 嫩草视频在线播放| 久久超碰精品| 午夜福利高清在线观看| 中文字幕黄色| 日韩人妻一区二区| 亚洲熟妇在线观看一区二区| 国产AV黄色| 亚洲avwww| 亚洲精品成AV人片天堂无码| 国产毛片一照区| 亚洲AV无码专区在线播放中文| 五月丁香欧美| 91成人一区二区| 91人人人| 特级西西444www高清大胆免费看 | 亚洲一区AV| 91精品国际| 天天摸天天日| 成人视频网| 国产午夜精品一区二区三区牛牛| 国产高清视频在线观看| 亚洲国产精品精JIZZ老师 | 波多一区| 久久午夜无码鲁丝片午夜精| 96精品久久久久久久久久| 91日韩精品| 五月丁香六月久久| 久久久久久婷婷| 无码av无码AV| 丰满人妻一区二区三区免费| 欧美一区二区三区在线| 人与禽一级A片一区二区三区| 无码群交东京热| 九七AV| 无码A∨| 高清毛片AAAAAAAAA郊外| 99精品久久久久久无码| 国产一区二区免费在线观看 | 亚洲中文字幕在线视频观看| 秋霞久久日| 免费二区| 亚洲中字幕新| 最新中文字幕在线观看视频| 男人天堂手机视频| 亚洲视频欧美| 天堂网视频| 91黑人| 91黄色毛片| 91乱子伦国产乱| 美日韩综合| 国产日韩欧美综合在线| 一二三区| 五月天伊人| 国产成人免费观看视频| 成人网站一区| 欧美一级性爱在线观看| 久久99老妇伦国产熟女| 泄火熟妇2-ThePorn| 91一区二区在线观看| 91三级片在线观看| 久久九九国产| 亚洲欧美91| 久久久久久免费视频| 亚洲精品日日夜夜| 成人毛片| 国产精品中文字幕在线观看| 亚洲理论电影| 日本国产视频| 国产精品久久久久久久久免费无码 | 亚洲AV在线看| 一级大香蕉| 欧美另类色图| 麻豆成人精品国产免费| 亚洲无码高清在线观看视频 | 国产视频你懂的| 久久老女人| 国产乱子伦真实精品| 1000部毛片A片免费视频| 久热免费视频| 无码1区| 精品一区二区三区蜜桃臀www| 中文字幕成人视频| 毛片性爱视屏| AAA片| 国产1024在线| 亚洲综合另类| 一区二区三区四区无码在线| 国产一区二区av| 精品视频在线观看免费| 国产主播精品在线| 91人人妻人人澡人人爽| 一区二区免费在线观看| 日本三区| 国产一级片| 骚妇大战黑人15P| 色婷婷五月激情| 在线看黄片| 91蝌蚪视频在线播放| 久久精品一区| 亚洲高清无码免费观看| 懂色中国闺密偷情懂色AV| 天天干天天干天| 亚洲精品成人片在线观看精品字幕 | 九九偷拍| 国产ts| 国产中文字幕AV在线播放| 亚洲精品人妻在线| 综合自拍偷拍| 性生活毛片| 亚洲精品久久久久毛片A级绿茶| 狼友初视频在线观看| 日韩在线中文字幕视频| 免费福利视频网站| 91无码精品| 日韩精品免费在线观看| 欧美一道本在线| 国产美女高潮视频| 夜夜嗨老熟女AV一区二区三区 | 香蕉一区二区| 久久久久久黄片| 日日干天天操| 亚洲第一视频在线观看| 午夜亚洲AV永久无码精品麻豆| 日韩AV小说| 国产乱伦毛片| 国产在线观看免费成人视频| 视频二区中文字幕| 操逼视频观看免费| 亚洲精品成AV人片天堂无码| 蜜臀久久99精品久久久久久宅男 | 激情五月婷婷综合| 国产精品秘入口18禁网站| 人人澡人人爽人人精品| 97综合视频| 日韩综合精品中文字幕66| 西西4444大胆无码视频| 日本一区二区网站| 国产肏屄视频| 黄色视频电影| 伊人二区| 亚洲天堂男人的天堂| 欧美怕怕| 国产一级AAAAA片免费| 日韩91在线| 久久久久久亚洲AV黄床| 性无码一区二区三区| 特黄AAAAAAAA片免费直播| 久久国产精| 大香蕉日韩| 日韩黄色免费电影| 尹人大香蕉网| 人人操超碰| 亚洲电影中文字幕| 亚洲国产精品欧美久久| 黄色福利在线观看| 91av一区| 夜夜撸视频| 婷婷五月丁香色| 久草大香蕉在线| 漂亮人妻吃鸡啪啪哥哥真的好 | 永久免费无码中文字幕| 成人H视频| 欧美中文字幕| 大鸡巴视频在线观看| 337P粉嫩大胆噜噜噜55569| 秋霞无码一区二区三区| 91蝌蚪| av无码av天天av天天爽| 久久久久大香蕉| 天天干天天日天天射| 日韩AV资源网| 成人精品视频| 一级a一级a爱片免费视频| 国产亲子乱XXXXimim/ | 亚洲精品性爱| 悠悠色影院| 免费AV毛片| 操屄视频免费观看| 精品国产三级| 蜜桃AV无码一区二区三区| 青娱乐三级在线免| 色汉综合| 天堂资源站| 美女在线扣穴| 91成人精品一区在线播放| 中文字幕免费在线播放| 欧美人成人无码| 人妻在线无码| 久久精品欧美| 国产灬性灬淫灬欲水灬| 久久偷看各类wc女厕嘘嘘偷窃| 天堂91| 黄片免费看| 综合AV| 蜜臀AV午夜精品| 女人的天堂网| 黄色视频网站在线免费观看| 91蝌蚪视频在线播放| 2025天天操夜夜操| 天天做天天干| 日本在线小视频| 91香蕉在线视频| 久久舔| 大鸡巴视频在线观看| 蜜桃传媒av| 91红桃视频| 粉嫩一区二区三区四区| 波多野结衣网址| 欧美l∨视| 中文字幕aV在线| 男女啪啪啪网站| 在线播放亚洲| 亚洲美女操| 国产一级AV免费观看| 中文字幕精品一区久久久久| 国产高清免费视频| 无码狠狠躁久久久久久久91 | 午夜成人网站| 久久蜜桃视频| 99久久人妻无码中文字幕系列 | 久久大香蕉| 国产AV一级片| 精品人妻无码一区二区三区| 欧美色图在线视频| 久大香蕉| 超碰免费观看| 中文字幕少妇| 无码人妻一区二区三区三| 免费AV成人| 欧美黄色影院| 日韩少妇视频| 国产精品久久久久无码| 日韩黄色小电影| 五月天色婷婷丁香| 天堂亚洲精品| 91嫖妓站街按摩店老熟女| 黄色视频一级| 永久免费黄色视频| 91人妻一区二区三区无不码超满 | 国产成人777777精品综合| 在线视频A| 99高清国产| 久久国产偷拍| 欧美51精品| 亚洲成人视频网| www.re99| h亚洲| 无码AV一区| 国产无码激情视频| 国产伊人大香蕉| 国产99久久九九精品无码免费| 亚洲无码大全| www.狠狠| 青娱AV| 欧美一级片免费看| 999在线视频| 人人操超碰在线观看| 国产日韩欧美91| 国产小电影在线观看| 欧美a区| 亚洲三级在线播放| 乱子伦国产精品一区二区| 特级西西人体WWWWW| 欧美性猛交XXXX乱大交蜜桃| 中文字幕三区| 人人摸人人看| 精品人人操| 精品成人在线观看| 四虎性爱视频| 性久久久久久久| 韩国av在线| 色av影音先锋无吗一区| 亚洲无码中文视频| 天天干天天撸影视| 亚洲欧美日韩不卡| 人人看人人澡| 在线亚洲免费| 国产精品扒开腿做爽爽爽A片唱戏 中文字幕一区二区三区精华液 | 亚洲天堂无码AV| 2025av天堂网| 一本色道久久加勒比精品| 九九国产视频| 成人伊人| 黄色视频免费观看| 欧美插菊花综合网| 俺去俺来也www色官网黑人| 粉嫩小泬BBBB免费看-百度| 国产AV三级片| 三级片日本在线| 人妻爽爽| 最新色站| 免费一级黄色电影| 欧美熟女一区| R四虎18| 大香蕉午夜视频| 精品成人久久| 色五月综合网| 伊人成人视频在线观看| 国产日韩二区| 欧美综合精品| 亚洲精品三级| 婷婷男人天堂| 4388亚洲最大| 天天草天天撸| 亚洲成人无码电影| 天天噜天天操| 7799综合| 极品少妇久久久| 爱操逼综合网| 成人小说视频在线社区| 国产成人h| 国产综合一区二区| 国产精品久久久久久久久久王安宇 | 免费在线观看一区| 人人澡人人爽人人精品| 精品一区二区三区在线观看| 天天综合天天做天天综合| 短发妹子双人啪啪秀| 日韩欧美在线一区| 亚洲欧美日韩一区二区| 免费人成年激情视频在线观看| 超碰成人欧美| 内射91| 在线免费看AV片| 天天舔九色婷婷| 欧美精品人妻| 日本三级网站| 九九精品免费视频| 在线www| 亚洲综合天堂| 亚洲精品中文字幕在线| 超碰97老师| 91在线网址| 欧美一级A片高清免费播放| 黄色草莓视频| 你懂的在线网站| 男女网站在线观看| 日韩久久中文字幕| 黄色无码视频| 嫩草导航| 江苏妇搡BBBB搡BBBB| 夜夜欢天天干| 美日韩在线观看| 一区二区三区在线观看免费| 成人无码区免费AV片| 日本一区二区三区视频在线观看| 亚洲成人久久久| 蜜桃一区二区中午字幕| 亚洲高清电影| 成人激情在线| 干日本少妇| 欧美人人爱| 欧美三级片视频| 一级a免一级a做免费线看内裤| 青青草成人在线观看| 天天干B| 久久久WWW成人免费无遮挡大片 | 欧美在线黄色| 欧美三级精品| 日逼天堂| www.大鸡巴| 大香蕉网址| 欧美福利视频| a级黄色视频免费观看| 日韩无码高清免费视频| 精国产品一区二区三区A片| 青青操逼视频| 懂色av,蜜臀AV粉嫩av| 日本中文字幕无码| 人人色人人| 日本三级片在线| 苍井空无码| 成人亚洲| 色色激情视频| 69av天堂| 动漫操逼视频| 少妇久久久久久久久久| 国产AV无码专区| 亚洲成人在线无码| 在线黄色av| 另类老妇videos另类| 91精品综合| 欧美日韩国产在线观看| 欧美五月在线网址| 校园春色成人| 欧美日韩三级| 91在线精品无码秘入口苹果| 中文字幕在线看| 精品黄片| 午夜视频99| 黄页免费无码| 精品91在线视频| 国产又爽又黄免费网站在| 一级二级三级无码| 日韩高清av| 无码h| 伊人大香蕉在线| 国产精品无码永久免费A片| 精品国产免费无码久久噜噜噜AV | 成人黄片在线免费观看| 97亚洲国产| 2026无码视频| 日本少妇黄色视频| 亚洲码AV波多野| 精品丰满人妻一区二区三区免费观| 亚洲日韩欧美中在线| 亚洲色图另类| 免费AV大全| 91成人精品一区在线播放| 伊人春色网| 五月天色色图| 亚洲最大网站| 高清成人无码| 精品999| 在线看a片| 牛牛成人在线视频| 91久久久久久久久| 国产一区一区| 九九99热| 91蜜桃网| 国产天堂在线| 黄色影院在线观看| 免费高潮视频| 91嫖妓站街按摩店老熟女| 欧美日韩性爰视频| 日本性欧美| av网站在线播放| 欧美口爆视频| 亚洲欧洲中文字幕| 久久久一区二区三区| 蜜桃久久久亚洲精| 亚洲天堂国产视频| 无码国产+白浆| 日韩码波多野结衣| 亚洲图片小说区| 日韩精品123| 92午夜福利天堂视频2019| av操操操| 亚洲一区翔田千里无码| 老婆中文字幕乱码中文乱码| 人妻无码一区二区三区摄像头 | 综合无码| 日韩成人免费| 999成人电影| 欧美成人A片AAA片在线播放| 上海熟妇搡BBBB搡BBBB| 中文字幕国产在线| 欧美日在线| 欧美成人视频。| 男女一区| www免费视频在线观看播放 | 天天射视频| 米奇电影777无码| 国产精品资源在线观看| 久久草在线播放| 九九无码视频| 欧美色成人免费在线视频| AV观看免费| 亚洲午夜av| 日本十八禁网站| 操东北女人逼| 一本色道久久综合无码人妻 | 黄色小电影网站| 99成人乱码一区二区三区在线| 国产精品免费一区二区三区四区视频 | av手机天堂网| 亚洲熟女av中文字幕| 日本不卡中文字幕| 91乱伦| 996热re视频精品视频这里| 国产精品51麻豆cm传媒| 色就色欧美| 天堂网在线播放| 在线观看无码高清| 精品人妻一区二区三区在| 日韩免费性爱视频| 欧美艹逼视频| 超碰99在线观看| 兔子先生和優奈玩游戲脫衣服,運氣報表優奈輸到脫精光 | 日韩欧美亚洲| 蜜臀AV一区二区三区免费看| 黄色视频网站观看| 一级黄色小视频| 中文在线A∨在线| 国内自拍无码| 久久免费精品视频| 91精品国产人妻| 色国产在线| 操逼视频免费播放| 少妇一区二区三区| 色99网站| 成人性爱在线视频| 日韩av免费在线观看| www伦理片-韩国三级三级三级a三级-成人AV | 中文字幕永久在线5| 天天爱天天插| 久久精品夜色噜噜亚洲A∨| 亚洲第一福利视频| 国产高清无码免费视频| 国产九九热视频| 欧美精品久久| av午夜福利| 国产在线观看免费视频| 91人体视频| 亚洲免费成人网| 特级毛片www| 亚洲高清无码久久| 乱伦激情视频| 中文字幕人妻互换av久久| 亚洲一区二区无码| 久久久久久黄| 欧美激情视频一区二区| 久久99深爱久久99精品| 91亚色视频| 强开小嫩苞一区二区三区网站| 欧美激情网址| 夜夜爽夜夜高潮夜夜爽| 亚洲精品成人一二三区| 无码人妻一区| 天天干夜夜操熟女| 男人的天堂青青草| 亚洲欧美性爱视频| 日韩欧美在线中文| 人人摸人人看人人草| 午夜成人无码| 炮友露脸青楼传媒刘颖儿| 中文字幕在线观看一区二区三区 | 欧美成人精品激情在线视频| 熟女无码| 一本久道视频一本久道| 熟睡侵犯の奶水授乳在线| 狠狠狠操| 东北A片| 精品无码专区| 久久丁香五月婷婷五月天激情视频| 鲁一鲁在线视频| 东京热av在线| 亚洲成人大香蕉视频| 91麻豆视频在线观看| AV在线精品| 亚洲天堂在线观看网站| 91AV一区二区| 日韩精品人妻中文字幕| 久久久www成人免费毛片| A级免费毛片| 免费无码高清视频| 少妇三级| 欧美亚洲动漫| 成人无码免费毛片A片| 精精品人妻一区二区三区| 国产人成视频免费观看|