區域性加權線性迴歸(內含程式碼)
在之前的部落格中我們已經簡單討論過一些迴歸的演算法,如使用假設和梯度下降法的單變數線性迴歸和多變數線性迴歸以及採用正規方程的線性迴歸,這次我們簡單討論一下區域性加權線性迴歸(Local Weighted Liner Regression)。
區域性加權迴歸可以看做正規方程的一種改進,通過上次部落格中的程式碼,我們針對那個資料集會產生一個下圖所示的擬合曲線:
從上面可以看出,該曲線擬合的效果不是很好,存在著欠擬合的現象,但是對於正規方程來說這是最好的擬合曲線。所以我們想尋求一種方式對上述方法進行改進,從而降低估計時的均方誤差。
其中一種方法就是區域性加權迴歸。該演算法不像正規方程一樣,對於所有的預測點,訓練樣本集上對它的作用是相同的,這種演算法採用核的方法對於不同測試樣本賦予訓練樣本不同權值,該方法求解出迴歸係數
其中,
上式中的k值決定了對於附近的點應該賦予多大的權值。高斯核的物理含義為:對於靠近測試點的樣本點,賦予更大的權值距離測試點越遠的樣本點,權值越小。下圖顯示了k值與權重的關係(假設預測點為0.5):
當k=0.5時,大部分的資料都用於訓練迴歸模型;而對於k=0.01時,僅有很少的資料點用於訓練迴歸模型。
從上面分析中,我們可以看出,相對於正規方程,區域性加權線性迴歸的計算複雜度大得多,因為對於每個測試點進行預測時,都需要所有的訓練資料集。但是該方法的擬合效果明顯可以好於正規方程的擬合效果。
區域性加權線性迴歸的程式碼如下:
# -*- coding: utf-8 -*-
"""
Created on Fri Nov 17 09:58:51 2017
@author: YL Wang
"""
import numpy as np
import matplotlib.pyplot as plt
def loadDataSet(fileName):
num_fea=len(open(fileName).readline().split(','))-1 #獲得特徵的數量
fr=open(fileName) #開啟檔案
featureArr=[]
labelArr=[]
# 讀取每一行的資料
for line in fr.readlines():
line_fea=[]
line_data=line.strip().split(',') #將每一行的資料按照','分隔開(使用什麼分隔開看資料本身的構成)
line_data.insert(0,'1') #將特徵進行擴充,將特徵矩陣轉化為增廣矩陣的形式
for i in range(num_fea+1):
line_fea.append(float(line_data[i])) #得到每一行的特徵
featureArr.append(line_fea)
labelArr.append(float(line_data[-1])) #得到每一行的標籤
return featureArr,labelArr
# 對於每個測試點求得最佳的theta
def lwlr(testpoint,featureArr,labelArr,k=1.0):
feature = np.mat(featureArr)
label = np.mat(labelArr).T
num_sample = np.size(label) #確定樣本的個數
weight = np.mat(np.eye(num_sample)) #初始化權重矩陣
#確定權重
for i in range(num_sample):
diffMat = testpoint - feature[i,:]
weight[i,i] = np.exp((diffMat*diffMat.T)/(-2*k**2))
xTwx = feature.T * weight * feature
if np.linalg.det(xTwx) == 0.0:
print("This matrix is singular, cannot do inverse")
return
theta = xTwx.I * feature.T * weight * label
return theta
# 使用訓練樣本來進行測試效能
def lwlrtest(featureArr,labelArr,k):
feature = np.mat(featureArr)
label = np.mat(labelArr)
num_sample = np.size(feature[:,1])
predict = np.zeros(num_sample)
for i in range(num_sample):
testpoint = feature[i,:]
theta = lwlr(testpoint,feature,label,k)
predict[i] = testpoint * theta
return predict
## 主程式
#得到特徵以及對應的標籤
featureArr,labelArr=loadDataSet('ex1data1.txt')
# 得到訓練集預測的結果
k = 0.4
predict = lwlrtest(featureArr,labelArr,k)
# 繪製圖像
feature = np.mat(featureArr)
srtInd = feature[:,1].argsort(0) # 對特徵進行排序,得到排序後特徵的標籤
feature_sort = feature[srtInd][:,0,:] #得到排序後的特徵
label = np.mat(labelArr)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(feature_sort[:,1],predict[srtInd]) #繪製擬合的曲線
ax.scatter(feature[:,1].flatten().A[0],label.T.flatten().A[0],s=2,c='red')
下面顯示了對於不同的k值,產生的擬合效果:
當k=1時的擬合效果
當k=0.5時的擬合效果
當k=0.2時的擬合效果
明顯看出k值的選擇對於擬合的效果有很大的影響,當k=1時,擬合效果不是很好,仍然存在較大的均方誤差;對於k=0.5時,擬合效果會好很多;很明顯對於k=0.2時,擬合效果有點過擬合。
本人菜鳥一枚,有理解不對的地方歡迎指正。
相關推薦
區域性加權線性迴歸(內含程式碼)
在之前的部落格中我們已經簡單討論過一些迴歸的演算法,如使用假設和梯度下降法的單變數線性迴歸和多變數線性迴歸以及採用正規方程的線性迴歸,這次我們簡單討論一下區域性加權線性迴歸(Local Weighted Liner Regression)。 區域性加權迴歸可以
區域性加權線性迴歸(Locally weighted linear regression)
緊接著之前的問題,我們的目標函式定義為: 我們的目標是最小化cost function: 換成線性代數的表述方式: 是mxm維的對角矩陣 是mxn維的輸入矩陣 是mx1維的結果 是nx1維的引數向量 令 有 既 權重定義為: 引數τ控制權重函式的寬度,τ越
機器學習基礎(三十) —— 線性迴歸、正則化(regularized)線性迴歸、區域性加權線性迴歸(LWLR)
1. 線性迴歸 線性迴歸根據最小二乘法直接給出權值向量的解析解(closed-form solution): w=(XTX)−1XTy 線性迴歸的一個問題就是有可能出現欠擬合現象,因為它求的是具有最小均方誤差(LSE,Least Square Erro
機器學習實戰——線性迴歸和區域性加權線性迴歸(含python中複製的四種情形!)
書籍:《機器學習實戰》中文版 IDE:PyCharm Edu 4.02 環境:Adaconda3 python3.6 注:本程式相比原書中的程式區別,主要區別在於函式驗證和繪圖部分。 一、一般線
機器學習(六)——區域性加權線性迴歸(Locally weighted linear regression)
考慮從x∈R中預測y的問題。下面最左邊的圖顯示了將擬合到資料集的結果。我們看到資料並不是直線上的,所以擬合不是很好。取代原來的方法,如果我們加上一個額外的特徵 x2x2,並用 y=θ0+θ1x+θ2x2y=θ0+θ1x+θ2x2 來擬合數據,你會發現效果稍微好了那麼一點(看中
機器學習實戰(七)線性迴歸(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 什麼是線性迴歸演算法?
機器學習-線性迴歸(LMS Algorithm)
今天正式開始機器學習之路(看的斯坦福大學的視訊課以及講義),由於看的時候濛濛的,因此想要找個平臺儲存一下自己學習的成果,因此寫了此篇文章,作為機器學習的小白,文章可能有諸多不妥之處,不作為學術理論的深入研究範圍。因為我是小白,我是小白,我是小白。 由於第一次用簡書寫,所以可能格式不太對,請見諒。
線性模型-區域性加權線性迴歸 機器學習實戰
區域性加權線性迴歸 線性迴歸的一個問題是有可能出現欠擬合,因為它求的是具有最小均方誤差的無偏估計,顯然模型欠擬合將無法做出很好的迴歸預測,所以有些方法允許在估計中引入一些偏差,從而降低預測的均方誤差。區域性線性加權的思想是對待預測點附近的每個點賦予一個權重,然後在帶權的樣本上基於最小均方誤差來
線性迴歸(含推導)
迴歸與分類 1.線性迴歸有:⑴嶺迴歸 ⑵Lasso迴歸 2.機器學習主要分為有監督學習和無監督學習兩種。 3.無監督:事先沒有任何訓練資料樣本,需要直接對資料建模。 或者:通過已有的訓練(即已知資料及其對應的輸出)來訓練,從而得到一個模型,再利用這個模型將所有新的資料樣本
用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= θ
線性迴歸(logistic regression)
單變數線性迴歸 本文以單變數線性迴歸為例,且變數為一次方,多變數只需要增加變數x1,x2······的個數,變數x也可以有更高的次方。 h代表假設函式 theta代表引數 x代表輸入變數 y代表標籤 J代表損失函式 目標即為通過改變引數theta的值,最小化損
機器學習-線性迴歸(LMS Algorithm)
今天正式開始機器學習之路(看的斯坦福大學的視訊課以及講義),由於看的時候濛濛的,因此想要找個平臺儲存一下自己學習的成果,因此寫了此篇文章,作為機器學習的小白,文章可能有諸多不妥之處,不作為學術理論的深入研究範圍。因為我是小白,我是小白,我是小白。 由於第一次用簡書寫,所以可
基於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)演算法
(一)認識迴歸 迴歸是統計學中最有力的工具之一。機器學習監督學習演算法分為分類演算法和迴歸演算法兩種,其實就是根據類別標籤分佈型別為離散型、連續性而定義的。顧名思義,分類演算法用於離散型分佈預測,如前
【機器學習】區域性加權線性迴歸
一、問題引入 我們現實生活中的很多資料不一定都能用線性模型描述。依然是房價問題,很明顯直線非但不能很好的擬合所有資料點,而且誤差非常大,但是一條類似二次函式的曲線卻能擬合地很好。為了解決非線性模型建立線性模型的問題,我們預測一個點的值時,選擇與這個
Tensorflow環境下 線性迴歸(梯度下降)的練手例項(完整原始碼+說明)
Tensorflow 入門篇-最小二乘法的線性迴歸演算法 本文將藉助Tensorflow來實現最小二乘法的線性迴歸演算法。 大體的思路:首先生成隨機紊亂的資料集,然後構建線性迴歸的Graph,最後在Session中迭代train器,得到擬合的引數w和b,最後畫出擬
斯坦福:機器學習CS229:Exercise 1: Linear Regression線性迴歸(答案1)
先貼程式碼,有空再根據講義,逐條講解 謝謝黃博的資料! %% Machine Learning Online Class - Exercise 1: Linear Regression % Instructions % ------------ %
多項式迴歸(polynomial regression)轉換為線性迴歸(linear regression)
一、介紹 一元m次多項式迴歸方程: 二元二次多項式迴歸方程: 多元多次的多項式迴歸方程較複雜,加之實際生產生活中一元m次多項式歸回就已經能夠解決了,所以略! 對於一元m次多項式迴歸方程,令: 則該一元m次多項式就轉化為m元線性迴歸方程: 因此,用多元線性函式的迴歸