日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习之线性回归缩减维度

發布時間:2023/12/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习之线性回归缩减维度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

機器學習之線性回歸縮減維度

    • 什么叫高維數據?
    • 維數膨脹
    • 數據降維
      • Lasso
      • 前向逐步回歸法
        • 前向逐步回歸法代碼實現
        • 前向逐步回歸法 縮減參數
    • 參考文獻

什么叫高維數據?


如上圖 前面 我們求解線性回歸的時候 列舉的一個例子。
這個例子中:
房子的面積, 房間的數量 , 樓間距, 離學校的距離 我們的數據 從這四個維度取例 ,也稱為數據的維度 用d表示。
下面的每一行 表示一個 房子的樣本 。 樣本可以有N 多個。

維數膨脹

當我們數據的維度 大于 樣本的數量的時候 我們稱為 維數膨脹

在分析高維數據過程中碰到最大的問題就是維數的膨脹,也就是通常所說的“維數災難”問題。研究表明,隨著維數的增長,分析所需的空間樣本數會呈指數增長

如下所示,當數據空間維度由1增加為3,最明顯的變化是其所需樣本增加;換言之,當樣本量確定時,樣本密度將會降低,從而樣本呈稀疏狀態。假設樣本量n=12,單個維度寬度為3,那在一維空間下,樣本密度為12/3=4,在二維空間下,樣本分布空間大小為3*3,則樣本密度為12/9=1.33,在三維空間下樣本密度為12/27=0.44。
設想一下,當數據空間為更高維時,X=[x1x1,x2x2,….,xnxn]會怎么樣?


1,需要更多的樣本,樣本隨著數據維度的增加呈指數型增長;
2,數據變得更稀疏,導致數據災難;
3,在高維數據空間,預測將變得不再容易;
4, 導致模型過擬合。

數據降維

對于高維數據,維數災難所帶來的過擬合問題,其解決思路是:
1)增加樣本量;
2)減少樣本特征
而對于現實情況,會存在所能獲取到的樣本數據量有限的情況,甚至遠小于數據維度,即:d>>n。如證券市場交易數據、多媒體圖形圖像視頻數據、航天航空采集數據、生物特征數據等。
常見的降維方法: lasso ,前向逐步回歸法,LAR,PCA 等。

這里我們先學習 兩種 lasso ,前向逐步回歸法。

Lasso

這篇文章詳細介紹了 嶺回歸
我們得出如下公式:

這個lamda 幫我們解決了 不是滿秩矩陣的問題。 但是 其中這個lamda 該取多少值呢 ?

因為 lamda 這個 因子的不確定性 所以得到權重也不太一樣 。


從這個圖中 我們可以發現 隨著 lamda 逐漸變大 ,權重中的 二維權重(x,y) y 值逐漸接近為 0 。
g(z)= w0x0 + 0x1那么我們調節 lamda值 就可以 減少 一個維度的數據 。 所以嶺回歸 不斷可以解決 滿秩矩陣的問題 ,還可以縮減 維度問題。

lasso 就是 對 上述的 權重 和 lamda 在做一個限制 。

n
Σ | Wk| ≤ λ
k=1

在λ 足夠小的時候 , 一些系數會因此被迫縮減到 0 。 這樣就可以減少 若干系數。

前向逐步回歸法

前向逐步回歸法 可以得到 跟lasso 差不多的效果。但是更加簡單。 它屬于 貪心算法 。

上圖中的 增大 或者減少 這樣操作 。 比如 g(z) = w0* X0 +w1 * X1

讓W0 += 0.1 或者 W0 += -0.1 比較 哪個誤差更小 。 誰小 就取哪個 。 就跟盲人探路 是一回事。 盲人沒走一步 就探測一下 前面有坑沒有 沒有就往前走 ,否則就往后退 。

前向逐步回歸法代碼實現

#coding=utf-8from numpy import *import numpy as np import matplotlib.pyplot as plt filename='./ex1.txt' #文件目錄 def loaddataSet(filename):numfeat = len(open(filename).readline().split('\t'))-1dataMat = [];labelsVec = []file = open(filename)for line in file.readlines():lineArr = []curLine = line.strip().split('\t')for i in range(numfeat):lineArr.append(float(curLine[i]))dataMat.append(lineArr)labelsVec.append(float(curLine[-1]))return dataMat,labelsVec def rssError(yArr,yHatArr): #yArr and yHatArr both need to be arraysreturn ((yArr-yHatArr)**2).sum() def stageWise(xArr,yArr,eps=0.01,numIt=10):xMat = mat(xArr); yMat=mat(yArr).TyMean = mean(yMat,0)#yMat = yMat - yMean #can also regularize ys but will get smaller coef#xMat = regularize(xMat)m,n=shape(xMat)returnMat = zeros((numIt,n)) #testing code removews = zeros((n,1)); wsTest = ws.copy(); wsMax = ws.copy()print("wsTest==",wsTest)for i in range(numIt):print( ws.T)lowestError = inf; for j in range(n):# 來回試探 看看 哪個適合for sign in [-1,1]:wsTest = ws.copy()print("wsTest[j]",wsTest[j])wsTest[j] += eps*signyTest = xMat*wsTestrssE = rssError(yMat.A,yTest.A)if rssE < lowestError:lowestError = rssEwsMax = wsTestws = wsMax.copy()returnMat[i,:]=ws.Treturn returnMat def PlotLine(X,wMat):fig = plt.figure()ax = fig.add_subplot(111)#number = 20ax.plot(wMat)print("X",X)#ax.plot(mat(X).T[:,1],wMat.T[:,1])plt.show() def TestStage():x,y= loaddataSet(filename)wMat=stageWise(x,y)PlotLine(x,wMat)TestStage()

前向逐步回歸法 縮減參數

很多同學估計跟我一樣 算法看明白了 但是 這個怎么就縮減參數了呢? 非常感謝 我的老朋友唐國斌 給了我很大的啟發 。

比如特征值有10個, w就有10個 ,逐步向前回歸就是直接把10個特征值,減少成9個 w也變成9個 然后看減少后,比減少前是否好,如果好了,就減少,一個個特征值去試,看看直接刪除這個特征值,會不會讓模型變得更好,有些特征值,刪除反而比保留好,這個是因為這些值可能和其他幾個特征值 差不多 就是信息冗余了

參考文獻

https://blog.csdn.net/xiaozhu_1024/article/details/80585151
再次 感謝 老朋友 唐國斌

總結

以上是生活随笔為你收集整理的机器学习之线性回归缩减维度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。