sklearn中降維演算法都被包括在模組decomposition中,這個模組本質是乙個矩陣分解模組。在過去的十年中,如果要討論演算法進步的先鋒,矩陣分解可以說是獨樹一幟。矩陣分解可以用在降維,深度學習,聚類分析,資料預處理,低緯度特徵學習,推薦系統,大資料分析等領域。在2023年,netflix曾經舉辦了乙個獎金為100萬美元的推薦系統演算法比賽,最後的獲獎者就使用了矩陣分解中的明星:奇異值分解svd。(~o ̄3 ̄)~菊安醬會講svd在推薦系統中的應用,大家不要錯過!
svd和主成分分析pca都屬於矩陣分解演算法中的入門演算法,都是通過分解特徵矩陣來進行降維,它們也是我們今天要說的重點。雖然是入門演算法,卻不代表pca和svd簡單:下面兩張圖是我在一篇svd的**中隨意擷取的兩頁,可以看到滿滿的數學公式(基本是線性代數)。要想給大家講明白這些公式,我講完不**大家聽完也**了。所以今天,我會用最簡單的方式為大家呈現降維演算法的原理,但這注定意味著大家無法看到這個演算法的全貌,在機器學習中逃避數學是邪道,所以更多原理大家自己去閱讀。
在降維過程中,我們會減少特徵的數量,這意味著刪除資料,資料量變少則表示模型可以獲取的資訊會變少,模型的表現可能會因此受影響。同時,在高維資料中,必然有一些特徵是不帶有有效的資訊的(比如噪音),或者有一些特徵帶有的資訊和其他一些特徵是重複的(比如一些特徵可能會線性相關)。我們希望能夠找出一種辦法來幫助我們衡量特徵上所帶的資訊量,讓我們在降維的過程中,能夠即減少特徵的數量,又保留大部分有效資訊——將那些帶有重複資訊的特徵合併,並刪除那些帶無效資訊的特徵等等——逐漸創造出能夠代表原特徵矩陣大部分資訊的,特徵更少的,新特徵矩陣。
上週的特徵工程課中,我們提到過一種重要的特徵選擇方法:方差過濾。如果乙個特徵的方差很小,則意味著這個特徵上很可能有大量取值都相同(比如90%都是1,只有10%是0,甚至100%是1),那這乙個特徵的取值對樣本而言就沒有區分度,這種特徵就不帶有有效資訊。從方差的這種應用就可以推斷出,如果乙個特徵的方差很大,則說明這個特徵上帶有大量的資訊。因此,在降維中,pca使用的資訊量衡量指標,就是樣本方差,又稱可解釋性方差,方差越大,特徵所帶的資訊量越多。
var代表乙個特徵的方差,n代表樣本量,xi代表乙個特徵中的每個樣本取值,xhat代表這一列樣本的均值。
面試高危問題方差計算公式中為什麼除數是n-1?這是為了得到樣本方差的無偏估計,更多大家可以自己去探索~
class sklearn.decomposition.pca(n_components=none, copy=true, whiten=false, svd_solver=』auto』, tol=0.0, iterated_power=』auto』, random_state=none)
pca作為矩陣分解演算法的核心演算法,其實沒有太多引數,但不幸的是每個引數的意義和運用都很難,因為幾乎每個引數都涉及到高深的數學原理。為了引數的運用和意義變得明朗,我們來看一組簡單的二維資料的降維。
我們現在有一組簡單的資料,有特徵x1和x2,三個樣本資料的座標點分別為(1,1),(2,2),(3,3)。我們可以讓x1和x2分別作為兩個特徵向量,很輕鬆地用乙個二維平面來描述這組資料。這組資料現在每個特徵的均值都為2,方差則等於:
每個特徵的資料一模一樣,因此方差也都為1,資料的方差總和是2。
現在我們的目標是:只用乙個特徵向量來描述這組資料,即將二維資料降為一維資料,並且盡可能地保留資訊量,即讓資料的總方差盡量靠近2。於是,我們將原本的直角座標系逆時針旋轉45°,形成了新的特徵向量x1*和x2*組成的新平面,在這個新平面中,三個樣本資料的座標點可以表示為$(sqrt,0)$,$(2sqrt,0)$,$(3sqrt,0)$。可以注意到,x2*上的數值此時都變成了0,因此x2*明顯不帶有任何有效資訊了(此時x2*的方差也為0了)。此時,x1*特徵上的資料均值是$2sqrt$,而方差則可表示成:
x1*上的資料均值為0,方差也為0。
此時,我們根據資訊含量的排序,取資訊含量最大的乙個特徵,因為我們想要的是一維資料。所以我們可以將x2*刪除,同時也刪除圖中的x2*特徵向量,剩下的x1*就代表了曾經需要兩個特徵來代表的三個樣本點。通過旋轉原有特徵向量組成的座標軸來找到新特徵向量和新座標平面,我們將三個樣本點的資訊壓縮到了一條直線上,實現了二維變一維,並且盡量保留原始資料的資訊。乙個成功的降維,就實現了。
不難注意到,在這個降維過程中,有幾個重要的步驟:
在步驟3當中,我們用來找出n個新特徵向量,讓資料能夠被壓縮到少數特徵上並且總資訊量不損失太多的技術就是矩陣分解。pca和svd是兩種不同的降維演算法,但他們都遵從上面的過程來實現降維,只是兩種演算法中矩陣分解的方法不同,資訊量的衡量指標不同罷了。pca使用方差作為資訊量的衡量指標,並且特徵值分解來找出空間v。降維時,它會通過一系列數學的神秘操作(比如說,產生協方差矩陣$fracxx^$)將特徵矩陣x分解為以下三個矩陣,其中$q$和$q^$是輔助的矩陣,σ是乙個對角矩陣(即除了對角線上有值,其他位置都是0的矩陣),其對角線上的元素就是方差。降維完成之後,pca找到的每個新特徵向量就叫做「主成分」,而被丟棄的特徵向量被認為資訊量很少,這些資訊很可能就是噪音。
而svd使用奇異值分解來找出空間v,其中σ也是乙個對角矩陣,不過它對角線上的元素是奇異值,這也是svd中用來衡量特徵上的資訊量的指標。u和v^分別是左奇異矩陣和右奇異矩陣,也都是輔助矩陣。
在數學原理中,無論是pca和svd都需要遍歷所有的特徵和樣本來計算資訊量指標。並且在矩陣分解的過程之中,會產生比原來的特徵矩陣更大的矩陣,比如原資料的結構是(m,n),在矩陣分解中為了找出最佳新特徵空間v,可能需要產生(n,n),(m,m)大小的矩陣,還需要產生協方差矩陣去計算更多的資訊。而現在無論是python還是r,或者其他的任何語言,在大型矩陣運算上都不是特別擅長,無論**如何簡化,我們不可避免地要等待計算機去完成這個非常龐大的數學計算過程。因此,降維演算法的計算量很大,執行比較緩慢,但無論如何,它們的功能無可替代,它們依然是機器學習領域的寵兒。
思考:pca和特徵選擇技術都是特徵工程的一部分,它們有什麼不同?
旋轉矩陣演算法
question 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 void func int n 要求 通過傳入的n,輸出乙個4 4的矩陣,順序如上圖所示.code nxn矩陣 include using namespace std include define max...
旋轉矩陣的演算法
旋轉矩陣是計算機圖形學裡面的基礎內容。之前我還寫過一篇計算機圖形學基礎知識的總結 操作的步驟可以分為兩部,一是沿正對角線對稱,二是沿水平對稱軸對稱 原圖 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 第一步之後 1 5 9 13 2 6 10 14 3 7 11 15...
懶人讀演算法(七) 旋轉矩陣
給乙個數字n,你要畫出從1到n平方的旋轉矩陣 如n 3,則你要畫出一下的乙個陣列 1,2,3 8,9,4 7,6,5 答案 public class solution 確定1,2,3 rowstart 行開始加1 for int i rowstart i rowend i 確定4,5 colend ...