python協方差求
1. python-協方差矩陣對角線上的方差的定義
在網上查了很久,自主編寫代碼以求解。
課本中提及協方差矩陣對角線上的元素代表各自變數的方差,然而在使用numpy庫中的np.cov(X)函數得到的協方差矩陣,其對角線上的數值並非直接由np.var()函數計算得出。原因在於,np.cov(X)函數計算的是樣本協方差而非普通意義上的方差。
簡而言之,均值、方差與協方差在數理統計框架下計算方式有所不同,均值保持不變,而方差與協方差的計算分別除以n與n-1。這一差異解釋了為何np.cov(X)的對角線數值與np.var()結果不一致。
設兩個隨機變數為X與Y,假設我們有觀測數據構成的數據集,可以將數據集視作隨機變數的特徵。
通過Python實現樣本均值計算如下:
數學定義:均值 = Σx / n,其中x為隨機變數的觀測值,n為觀測值數量。
Python代碼:使用np.mean()函數實現。
樣本均值計算結果:變數X的樣本均值為a,變數Y的樣本均值為b。
接下來,進行樣本方差計算:
數學定義:樣本方差 = Σ(x - μ)² / (n-1),其中x為隨機變數的觀測值,μ為樣本均值,n為觀測值數量。
Python代碼:使用np.cov()函數實現。
樣本方差計算結果:變數X的樣本方差為c,變數Y的樣本方差為d。
方差計算如下:
數學定義:方差 = Σ(x - μ)² / n,其中x為隨機變數的觀測值,μ為平均值,n為觀測值數量。
Python代碼:使用np.var()函數實現。
方差計算結果:變數X的方差為e,變數Y的方差為f。
總結,原始數據集計算平均值、方差與協方差時,需區分統計學定義下的樣本均值、樣本方差以及與日常理解一致的平均值、方差。在Python中,使用np.mean()與np.cov()函數時,前者與後者在概念上對應樣本均值與樣本協方差矩陣的計算。
了解無偏估計與有偏估計的概念後,方差定義中的系數調整為n-1,以確保樣本方差成為總體方差的無偏估計。這一調整是統計學中的一般做法,旨在提供更精確的估計。
因此,通過理解上述概念與計算方法,我們能夠清晰地解釋為何在Python中計算協方差矩陣時,其對角線上的方差值與直接使用np.var()函數計算的結果不同,這主要歸因於統計學定義上的差異。
2. python怎麼數據進行pca
基本步驟:
對數據進行歸一化處理(代碼中並非這么做的,而是直接減去均值)
計算歸一化後的數據集的協方差矩陣
計算協方差矩陣的特徵值和特徵向量
保留最重要的k個特徵(通常k要小於n),也可以自己制定,也可以選擇一個閾值,然後通過前k個特徵值之和減去後面n-k個特徵值之和大於這個閾值,則選擇這個k
找出k個特徵值對應的特徵向量
將m * n的數據集乘以k個n維的特徵向量的特徵向量(n * k),得到最後降維的數據。
其實PCA的本質就是對角化協方差矩陣。有必要解釋下為什麼將特徵值按從大到小排序後再選。首先,要明白特徵值表示的是什麼?在線性代數裡面我們求過無數次了,那麼它具體有什麼意義呢?對一個n*n的對稱矩陣進行分解,我們可以求出它的特徵值和特徵向量,就會產生n個n維的正交基,每個正交基會對應一個特徵值。然後把矩陣投影到這N個基上,此時特徵值的模就表示矩陣在該基的投影長度。
特徵值越大,說明矩陣在對應的特徵向量上的方差越大,樣本點越離散,越容易區分,信息量也就越多。因此,特徵值最大的對應的特徵向量方向上所包含的信息量就越多,如果某幾個特徵值很小,那麼就說明在該方向的信息量非常少,我們就可以刪除小特徵值對應方向的數據,只保留大特徵值方向對應的數據,這樣做以後數據量減小,但有用的信息量都保留下來了。PCA就是這個原理。
3. 如何運用Python進行描述分析
在數據分析領域,Python以其強大的功能成為了首選工具。過去幾年,Python已成為最受歡迎的數據分析語言,它在數據科學領域發揮著至關重要的作用。如果你對Python在描述分析中的應用感興趣,你可能已經關注過之前關於Python函數以及數據分析程序庫的文章,以及如何利用Pandas清洗數據的指南。接下來,我們將深入探討如何利用Python進行描述性分析。
描述性分析是數據分析的基礎,它旨在通過統計和圖表來總結數據集的主要特徵。該方法包括分析數據的集中趨勢、離散程度、頻數分布等。以下是一些Python中用於描述性分析的關鍵函數:
平均數:使用np.mean()。
總和:使用np.sum()。
中位數:使用np.median()。
最大值:使用np.max()。
最小值:使用np.min()。
頻次(計數):使用np.size()。
方差:使用np.var()。
標准差:使用np.std()。
乘積:使用np.prod()。
協方差:使用np.cov(x, y)。
偏度系數:使用skew(x)。
峰度系數:使用kurt(x)。
正態性檢驗結果:使用normaltest(np.array(x))。
四分位數:使用np.quantile(q=[0.25, 0.5, 0.75],interpolation=「linear」)。
描述性統計摘要:使用describe()。
接下來,我們通過一個具體的數據集來展示如何在Python中執行描述性分析。該數據集包含一個班級學生的相關信息,包括姓名、性別、身高和體重。
首先,創建數據幀以載入數據集:
運行代碼以查看數據集的前幾個觀測樣本。
接下來,我們來分析數據的集中趨勢:
算術平均值:使用np.mean()或Pandas的describe()函數計算。
幾何平均數:通過調用Scipy庫中的相應函數計算。
眾數:使用Pandas的mode()函數。
在離散程度方面,我們可以通過以下方法進行分析:
極差與四分位差:使用describe()函數計算。
平均離差:使用Pandas的mad()函數。
標准差:使用np.std()或describe()。
離散系數:計算標准差與平均數之比。
分布狀態的分析包括偏態和峰度。偏態和峰度分別通過以下方法計算:
偏態:使用skew()。
峰度:使用kurt()。
最後,我們探索數據之間的相關性,包括:
散點圖:使用Pandas的plot.scatter()或Matplotlib的scatter()。
相關系數:使用Pandas的corr()。
相關系數矩陣圖:使用Seaborn的heatmap()。
掌握這些技術後,你將能夠有效地利用Python進行描述性分析,深入理解數據集的特性。本篇文章涵蓋了Python在描述性分析中的常用函數和方法,並通過實例演示了如何應用這些工具。在下一期文章中,我們將進一步探討Python在數據分析中的應用,敬請期待!
4. PCA(主成分分析)python實現
回顧了下PCA的步驟,並用python實現。深刻的發現當年學的特徵值、特徵向量好強大。
PCA是一種無監督的學習方式,是一種很常用的降維方法。在數據信息損失最小的情況下,將數據的特徵數量由n,通過映射到另一個空間的方式,變為k(k<n)。
這里用一個2維的數據來說明PCA,選擇2維的數據是因為2維的比較容易畫圖。
這是數據:
畫個圖看看分布情況:
協方差的定義為:
假設n為數據的特徵數,那麼協方差矩陣M, 為一個n n的矩陣,其中Mij為第i和第j個特徵的協方差,對角線是各個特徵的方差。
在我們的數據中,n=2,所以協方差矩陣是2 2的,
通過numpy我們可以很方便的得到:
得到cov的結果為:
array([[ 0.61655556, 0.61544444],
[ 0.61544444, 0.71655556]])
由於我們之前已經做過normalization,因此對於我們來說,
這個矩陣就是 data*data的轉置矩陣。
得到結果:
matrix([[ 5.549, 5.539],
[ 5.539, 6.449]])
我們發現,其實協方差矩陣和散度矩陣關系密切,散度矩陣 就是協方差矩陣乘以(總數據量-1)。因此他們的 特徵根 和 特徵向量 是一樣的。這里值得注意的一點就是,散度矩陣是 SVD奇異值分解 的一步,因此PCA和SVD是有很大聯系的,他們的關系這里就不詳細談了,以後有機會再寫下。
用numpy計算特徵根和特徵向量很簡單,
但是他們代表的意義非常有意思,讓我們將特徵向量加到我們原來的圖里:
其中紅線就是特徵向量。有幾點值得注意:
藍色的三角形就是經過坐標變換後得到的新點,其實他就是紅色原點投影到紅線、藍線形成的。
得到特徵值和特徵向量之後,我們可以根據 特徵值 的大小,從大到小的選擇K個特徵值對應的特徵向量。
這個用python的實現也很簡單:
從eig_pairs選取前k個特徵向量就行。這里,我們只有兩個特徵向量,選一個最大的。
主要將原來的數據乘以經過篩選的特徵向量組成的特徵矩陣之後,就可以得到新的數據了。
output:
數據果然變成了一維的數據。
最後我們通過畫圖來理解下數據經過PCA到底發生了什麼。
綠色的五角星是PCA處理過後得到的一維數據,為了能跟以前的圖對比,將他們的高度定位1.2,其實就是紅色圓點投影到藍色線之後形成的點。這就是PCA,通過選擇特徵根向量,形成新的坐標系,然後數據投影到這個新的坐標系,在盡可能少的丟失信息的基礎上實現降維。
通過上述幾步的處理,我們簡單的實現了PCA第一個2維數據的處理,但是原理就是這樣,我們可以很輕易的就依此實現多維的。
用sklearn的PCA與我們的pca做個比較:
得到結果:
用我們的pca試試
得到結果:
完全一致,完美~
值得一提的是,sklearn中PCA的實現,用了部分SVD的結果,果然他們因緣匪淺。