主成分分析:PCA的思想及鳶尾花實例實現

主成份分析算法PCA

非監督學習算法

PCA的實現:

簡單來說,就是將數據從原始的空間中轉換到新的特征空間中,例如原始的空間是三維的(x,y,z),x、y、z分別是原始空間的三個基,我們可以通過某種方法,用新的坐標系(a,b,c)來表示原始的數據,那么a、b、c就是新的基,它們組成新的特征空間。在新的特征空間中,可能所有的數據在c上的投影都接近于0,即可以忽略,那么我們就可以直接用(a,b)來表示數據,這樣數據就從三維的(x,y,z)降到了二維的(a,b)。

問題是如何求新的基(a,b,c)?

一般步驟是這樣的:
對原始數據零均值化(中心化),
求協方差矩陣,
對協方差矩陣求特征向量和特征值,這些特征向量組成了新的特征空間。

PCA–零均值化(中心化):

中心化即是指變量減去它的均值,使均值為0。
其實就是一個平移的過程,平移后使得所有數據的中心點是(0,0)
在這里插入圖片描述
只有中心化數據之后,計算得到的方向才能比較好的“概括”原來的數據。
此圖形象的表述了,中心化的幾何意義,就是將樣本集的中心平移到坐標系的原點O上。
在這里插入圖片描述

PCA–PCA降維的幾何意義:

我們對于一組數據,如果它在某一坐標軸上的方差越大,說明坐標點越分散,該屬性能夠比較好的反映源數據。所以在進行降維的時候,主要目的是找到一個超平面,它能使得數據點的分布方差呈最大,這樣數據表現在新的坐標軸上時候已經足夠分散了。
在這里插入圖片描述
PCA算法的優化目標就是:
① 降維后同一維度的方差最大 ② 不同維度之間的相關性為0(協方差)

PCA–協方差矩陣:

定義:
在這里插入圖片描述
比如,三維(x,y,z)的協方差矩陣:在這里插入圖片描述

協方差矩陣的特點:
協方差矩陣計算的是不同 維度之間的協方差, 而不是不同樣本之間的。
樣本矩陣的每行是一個樣本, 每列為一個維度, 所以我們要按列計算均值。
協方差矩陣的對角線就是各個維度上的方差
特別的,如果做了中心化,則協方差矩陣為(中心化矩陣的協方差矩陣公式):在這里插入圖片描述

PCA–對特征值進行排序:

在這里插入圖片描述

PCA–評價模型的好壞,K值的確定

通過特征值的計算我們可以得到主成分所占的百分比,用來衡量模型的好壞。

對于前k個特征值所保留下的信息量計算方法如下:
在這里插入圖片描述

代碼實現:

手動實現:

import numpy as np
class PCA():def __init__(self,n_components):self.n_components = n_componentsdef fit_transform(self,X):self.n_features_ = X.shape[1]# 求協方差矩陣X = X - X.mean(axis=0)  #0均值化self.covariance = np.dot(X.T,X)/X.shape[0]      #求協方差# 求協方差矩陣的特征值和特征向量eig_vals,eig_vectors = np.linalg.eig(self.covariance)# 獲得降序排列特征值的序號idx = np.argsort(-eig_vals)# 降維矩陣self.components_ = eig_vectors[:,idx[:self.n_components]]# 對X進行降維return np.dot(X,self.components_)# 調用
pca = PCA(n_components=2)   #降維為2
X = np.array([[-1,2,66,-1], [-2,6,58,-1], [-3,8,45,-2], [1,9,36,1], [2,10,62,1], [3,5,83,2]])  #導入數據,維度為4
newX=pca.fit_transform(X)
print(newX)                  #輸出降維后的數據

結果展示:
在這里插入圖片描述

接口實現:

import numpy as np
from sklearn.decomposition import PCA
X = np.array([[-1,2,66,-1], [-2,6,58,-1], [-3,8,45,-2], [1,9,36,1], [2,10,62,1], [3,5,83,2]])  #導入數據,維度為4
pca = PCA(n_components=2)   #降到2維
pca.fit(X)                  #訓練
newX=pca.fit_transform(X)   #降維后的數據
# PCA(copy=True, n_components=2, whiten=False)
print(pca.explained_variance_ratio_)  #輸出貢獻率
print(newX)                  #輸出降維后的數據

結果展示:
在這里插入圖片描述

PCA–鳶尾花實例:

我們通過Python的sklearn庫來實現鳶尾花數據進行降維,數據本身是4維的降維后變成2維。
其中樣本總數為150,鳶尾花的類別有三種。
在這里插入圖片描述
代碼實現:

import matplotlib.pyplot as plt
import sklearn.decomposition as dp
from sklearn.datasets import load_irisx,y=load_iris(return_X_y=True) #加載數據,x表示數據集中的屬性數據,y表示數據標簽
pca=dp.PCA(n_components=2) #加載pca算法,設置降維后主成分數目為2
reduced_x=pca.fit_transform(x) #對原始數據進行降維,保存在reduced_x中
red_x,red_y=[],[]
blue_x,blue_y=[],[]
green_x,green_y=[],[]
for i in range(len(reduced_x)): #按鳶尾花的類別將降維后的數據點保存在不同的表中if y[i]==0:red_x.append(reduced_x[i][0])red_y.append(reduced_x[i][1])elif y[i]==1:blue_x.append(reduced_x[i][0])blue_y.append(reduced_x[i][1])else:green_x.append(reduced_x[i][0])green_y.append(reduced_x[i][1])
plt.scatter(red_x,red_y,c='r',marker='x')
plt.scatter(blue_x,blue_y,c='b',marker='D')
plt.scatter(green_x,green_y,c='g',marker='.')
plt.show()

結果展示:
在這里插入圖片描述

PCA算法的優缺點:

優點:
它是無監督學習,完全無參數限制的。在PCA的計算過程中完全不需要人為的設定參數或是根據任何經驗模型對計算進行干預,最后的結果只與數據相關,與用戶是獨立的。
用PCA技術可以對數據進行降維,同時對新求出的“主元”向量的重要性進行排序,根據需要取前面最重要的部分,將后面的維數省去,可以達到降維從而簡化模型或是對數據進行壓縮的效果。同時最大程度的保持了原有數據的信息。
各主成分之間正交,可消除原始數據成分間的相互影響。
計算方法簡單,易于在計算機上實現。

缺點:
如果用戶對觀測對象有一定的先驗知識,掌握了數據的一些特征,卻無法通過參數化等方法對處理過程進行干預,可能會得不到預期的效果,效率也不高。
貢獻率小的主成分往往可能含有對樣本差異的重要信息。
特征值矩陣的正交向量空間是否唯一有待討論。
在非高斯分布的情況下,PCA方法得出的主元可能并不是最優的,此時在尋找主元時不能將方差作為衡量重要性的標準。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389548.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389548.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389548.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

兩家大型網貸平臺竟在借款人審核問題上“偷懶”?

python信用評分卡(附代碼,博主錄制) https://study.163.com/course/introduction.htm?courseId1005214003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 放貸流量增加,逾期率也會隨之增加&…

解決 Alfred 每次開機都提示請求通訊錄權限的問題

安裝完 Alfred 以后,每次開機都會提示請求通訊錄權限,把設置里的通訊錄關掉也沒用,每次都提示又非常煩人,這里把解決方法記錄一下。 依次打開 應用程序 - Alfred 3.app - 右鍵顯示包內容 - Contents - Frameworks - Alfred Framew…

【轉】DCOM遠程調用權限設置

原文:https://blog.csdn.net/ervinsas/article/details/36424127 最近幾天被搞得焦頭爛額,由于DCOM客戶端程序是在32位系統下開發的,調試時DCOM服務端也是安裝在同一臺機器上,所有過程一直還算順利。可這次項目實施的時候&#xf…

opencv:邊緣檢測之Laplacian算子思想及實現

Laplacian算子邊緣檢測的來源 在邊緣部分求取一階導數,你會看到極值的出現: 如果在邊緣部分求二階導數會出現什么情況? 從上例中我們可以推論檢測邊緣可以通過定位梯度值大于鄰域的相素的方法找到(或者推廣到大 于一個閥值). 從以上分析中&#xff0c…

使用機器學習預測天氣_如何使用機器學習預測著陸

使用機器學習預測天氣Based on every NFL play from 2009–2017根據2009-2017年每場NFL比賽 Ah, yes. The times, they are changin’. The leaves are beginning to fall, the weather is slowly starting to cool down (unless you’re where I’m at in LA, where it’s on…

laravel 導出插件

轉發:https://blog.csdn.net/gu_wen_jie/article/details/79296470 版本:laravel5 php 5.6 安裝步驟: 一、安裝插件 ①、首先在Laravel項目根目錄下使用Composer安裝依賴: composer require "maatwebsite/excel:~2.1.0"…

國外 廣告牌_廣告牌下一首流行歌曲的分析和預測,第1部分

國外 廣告牌Using Spotify and Billboard’s data to understand what makes a song a hit.使用Spotify和Billboard的數據來了解歌曲的流行。 Thousands of songs are released every year around the world. Some are very successful in the music industry; others less so…

Jmeter測試普通java類說明

概述 Apache JMeter是Apache組織開發的基于Java的壓力測試工具。本文檔主要描述用Jmeter工具對基于Dubbo、Zookeeper框架的Cassandra接口、區塊鏈接口進行壓力測試的一些說明,為以后類似接口的測試提供參考。 環境部署 1、 下載Jmeter工具apache-jmeter-3.3.zip&am…

opencv:Canny邊緣檢測算法思想及實現

Canny邊緣檢測算法背景 求邊緣幅度的算法: 一階導數:sobel、Roberts、prewitt等算子 二階導數:Laplacian、Canny算子 Canny算子效果比其他的都要好,但是實現起來有點麻煩 Canny邊緣檢測算法的優勢: Canny是目前最優…

關于outlook簽名圖片大小的說明

96 dpiwidth576 height114轉載于:https://blog.51cto.com/lch54734/2298115

opencv:畸變矯正:透視變換算法的思想與實現

畸變矯正 注意:雖然能夠成功矯正但是也會損失了部分圖像! 透視變換(Perspective Transformation) 概念: 透視變換是將圖片投影到一個新的視平面(Viewing Plane),也稱作投影映射(Projective Mapping)。 我們常說的仿射變換是透視…

數據多重共線性_多重共線性對您的數據科學項目的影響比您所知道的要多

數據多重共線性Multicollinearity is likely far down on a mental list of things to check for, if it is on a list at all. This does, however, appear almost always in real-life datasets, and it’s important to be aware of how to address it.多重共線性可能根本不…

PHP工廠模式計算面積與周長

<?phpinterface InterfaceShape{ function getArea(); function getCircumference();}/** * 矩形 */class Rectangle implements InterfaceShape{ private $width; private $height; public function __construct($width,$height){ $this->width$…

K-Means聚類算法思想及實現

K-Means聚類概念&#xff1a; K-Means聚類是最常用的聚類算法&#xff0c;最初起源于信號處理&#xff0c;其目標是將數據點劃分為K個類簇&#xff0c; 找到每個簇的中心并使其度量最小化。 該算法的最大優點是簡單、便于理解&#xff0c;運算速度較快&#xff0c;缺點是只能應…

(2.1)DDL增強功能-數據類型、同義詞、分區表

1.數據類型 &#xff08;1&#xff09;常用數據類型  1.整數類型 int 存儲范圍是-2,147,483,648到2,147,483,647之間的整數&#xff0c;主鍵列常設置此類型。 &#xff08;每個數值占用 4字節&#xff09; smallint 存儲范圍是-32,768 到 32,767 之間的整數&#xff0c;用…

充分利用昂貴的分析

By Noor Malik努爾馬利克(Noor Malik) Let’s say you write a query in Deephaven which performs a lengthy and expensive analysis, resulting in a live table. For example, in a previous project, I wrote a query which pulled data from an RSS feed to create a li…

【java并發編程藝術學習】(一)初衷、感想與筆記目錄

不忘初心&#xff0c;方得始終。 學習java編程這么長時間&#xff0c;自認為在項目功能需求開發中沒啥問題&#xff0c;但是之前的幾次面試和跟一些勤奮的或者小牛、大牛級別的人的接觸中&#xff0c;才發現自己的無知與淺薄。 學習總得有個方向吧&#xff0c;現階段就想把并發…

層次聚類和密度聚類思想及實現

層次聚類 層次聚類的概念&#xff1a; 層次聚類是一種很直觀的算法。顧名思義就是要一層一層地進行聚類。 層次法&#xff08;Hierarchicalmethods&#xff09;先計算樣本之間的距離。每次將距離最近的點合并到同一個類。然后&#xff0c;再 計算類與類之間的距離&#xff0…

通配符 或 怎么濃_濃咖啡的咖啡渣新鮮度

通配符 或 怎么濃How long could you wait to brew espresso after grinding? Ask a barista, any barista, and I suspect their answer is immediately or within a few minutes. The common knowledge on coffee grounds freshness is that after 30 minutes or so, coffee…

保留

看見 你在我眼前 不去猜想我們隔多遠 當我 夜幕中準備 只想讓沉默的能開解 在不同的遭遇里 我發現你的瞬間 有種不可言說的溫柔直覺 在有限的深夜消失之前 觸摸你的臉 我情愿這是幻覺 也不愿是種告別 已經忘了 你的名字 就在這座 寂靜星石 怎么還有 你的樣子 被保留 給我 一整個…