數據挖掘之PCA-主成分分析

PCA的用處:找出反應數據中最大變差的投影(就是拉的最開)。

在減少需要分析的指標同時,盡量減少原指標包含信息的損失,以達到對所收集數據進行全面分析的目的

但是什么時候信息保留的最多呢?具體一點?

首先:去中心化(把坐標原點放到數據中心,如上圖所示)

然后,找坐標系(找到方差最大的方向)

問題是:怎么找到方差最大的方向呢????????

一.引子

1.使用矩陣可以進行數據的線性變換(數據的拉伸)

2.使用矩陣可以進行數據的線性變換(數據的旋轉)

3.結合起來兩種操作

拉伸決定了方差最大的方向是橫或者縱

旋轉決定了方差最大的方向的角度

怎么求R?

協方差矩陣的特征向量就是R

二.數學原理:

三.PCA流程圖:

PCA與SVD的聯系:

四.例子:

五.代碼:

# -*- coding: utf-8 -*-
"""
Created on Tue Oct 13 11:12:24 2020@author: pc① 對原數據集零均值化。代碼是:meanRemoved = dataMat - mean(dataMat,axis=0)② 求出均值化X的協方差矩陣:公式是:Cov(X)=\frac{1}{m-1}X^{T}X,代碼是:covMat = cov(meanRemoved,rowvar=0)③ 求這個協方差矩陣的特征值,特征向量,代碼是:eigVals, eigVects = linalg.eig(mat(covMat))④ 把這些特征值按從大到小排列,返回特征值的下標,代碼是:eigValInd = argsort(-eigVals)⑤ 選出前topNfeat個特征值,返回這些選中的特征值的下標,并根據下標從特征向量矩陣eigVects中取出這些選中的特征向量組成矩陣P,這就是我們要找的變換矩陣P,代碼是:redEigVects = eigVects[:,eigValInd[:topNfeat] ]⑥ 返回降維后的數據,公式是:Y=X?P,代碼是:lowDDataMat = meanRemoved * redEigVects⑦ 原數據映射到新的空間中。公式是:X^{'}=Y\cdot P^{T}+mean,代碼是:reconMat = (lowDDataMat * redEigVects.T) + meanValues
"""import numpy as np
import matplotlib.pyplot as pltdef pca(dataMat, topNfeat = 999999):meanValues = np.mean(dataMat,axis=0) # 豎著求平均值,數據格式是m×nmeanRemoved = dataMat - meanValues  # 0均值化  m×n維covMat = np.cov(meanRemoved,rowvar=0)  # 每一列作為一個獨立變量求協方差  n×n維eigVals, eigVects = np.linalg.eig(np.mat(covMat)) # 求特征值和特征向量  eigVects是n×n維eigValInd = np.argsort(-eigVals)  # 特征值由大到小排序,eigValInd十個arrary數組 1×n維eigValInd = eigValInd[:topNfeat]  # 選取前topNfeat個特征值的序號  1×r維print(eigValInd)redEigVects = eigVects[:,eigValInd] # 把符合條件的幾列特征篩選出來組成P  n×r維lowDDataMat = meanRemoved * redEigVects  # 矩陣點乘篩選的特征向量矩陣  m×r維 公式Y=X*PreconMat = (lowDDataMat * redEigVects.T) + meanValues  # 轉換新空間的數據  m×n維return lowDDataMat, reconMatdef drawPoints(dataset1,dataset2):  # 畫圖,dataset1是沒降維的數據,dataset2是數據映射到新空間的數據fig = plt.figure()ax1 = fig.add_subplot(211)ax2 = fig.add_subplot(212)ax1.scatter(dataset1[:,0],dataset1[:,1],marker='s',s=5,color='red')dataset2 = np.array(dataset2)ax2.scatter(dataset2[:,0],dataset2[:,1],s=5,color='blue')plt.show()if __name__ == '__main__':dataSetList = []fr = open('pca_data_set1.txt')for row in fr.readlines():cur_line = row.strip().split('\t')proce_line = list(map(float,cur_line))dataSetList.append(proce_line)dataSetList = np.array(dataSetList)data = dataSetListproccess_data, reconMat = pca(data,topNfeat = 1)drawPoints(data,reconMat)

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

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

相關文章

?飛凌嵌入式FCU2601網關,為工商業儲能EMS注入智慧的力量

一、火熱的儲能行業,尋求新的市場機會 最近一段時間以來,世界儲能大會、上海儲能展、能源電子產業發展大會等多個儲能相關論壇和展覽密集登場,即使“內卷”已成為了業內討論的熱詞,但尋求新的市場機會仍然是行業共識,…

常用Redis的鍵命令參考

一、DEL DEL key [key …] 刪除給定的一個或多個 key 。 不存在的 key 會被忽略。 #刪除單個鍵127.0.0.1:6379> set name zhangsan OK 127.0.0.1:6379> del name (integer) 1# 刪除一個不存在的 key, 失敗,沒有 key 被刪除127.0.0.1:6379> E…

Qt C++中調用python,并將軟件打包發布,python含第三方依賴

工作中遇到qt c調用我的python 代碼,并且想要一鍵打包,這里我根據參考的以及個人實踐的結果來簡單實現一下。 環境:windows系統,QT Creater 4.5, python 3.8(anaconda虛擬環境) 1. 簡單QT調用…

【 Kubernetes 風云錄 】- Istio 應用多版本流量控制

文章目錄 原理實現DeploymentVirtualServiceDestinationRule 約束部署 目的: 根據不同的引擎版本,可以把請求發送到指定的引擎上。可以實現版本降級。 原理 Istio通過VirtualService和DestinationRule兩個資源對象來實現流量管理,其中VirtualService用于…

LeetCode Hot100 98.驗證二叉搜索樹

題目: 給你一個二叉樹的根節點 root ,判斷其是否是一個有效的二叉搜索樹。 有效 二叉搜索樹定義如下: 節點的左子樹只包含 小于 當前節點的數。節點的右子樹只包含 大于 當前節點的數。所有左子樹和右子樹自身必須也是二叉搜索樹。 方法一…

electron windows robotjs 安裝教程

Robotjs 安裝 前言第一步 : 安裝python第二步 : 安裝Visual Studio 2022第三步 : 安裝robotjs 前言 robotjs可以控制鼠標鍵盤,獲取屏幕內容,配合electron可做很多自動化操作。windows下配置環境有很多坑,很多文章都太舊了。試了很多次發現了…

ky10 server x86 auditd安裝(日志審計系統)

概述 Auditd工具可以幫助運維人員審計Linux,分析發生在系統中的發生的事情。Linux 內核有用日志記錄事件的能力,包括記錄系統調用和文件訪問。管理員可以檢查這些日志,確定是否存在安全漏洞(如多次失敗的登錄嘗試,或者…

golang學習筆記——接口和繼承比較2

接口和繼承 現在有一個需要要求大學生和足球運動員掌握英語技能,請問怎么實現? 給運動員和學生結構體添加studyEnglish方法顯示是可以的,但是籃球動員和中學生也學習了英語,顯示不行。這時,我們可以直接給足球運動員和大學生添加…

跳轉應用市場詳情頁market

關于作者:CSDN內容合伙人、技術專家, 從零開始做日活千萬級APP。 專注于分享各領域原創系列文章 ,擅長java后端、移動開發、商業變現、人工智能等,希望大家多多支持。 未經允許不得轉載 目錄 一、導讀二、概覽三、跳轉到各大廠商應…

播放器開發(四):多線程解復用與解碼模塊實現

學習課題:逐步構建開發播放器【QT5 FFmpeg6 SDL2】 前言 根據第一章內容,我們首先可以先把解復用和解碼模塊完成,其中需要使用到多線程以及隊列,還需要使用FFmpeg進行解復用和解碼動作的實現。 創建BaseQueue基類 BaseQueue.h…

亞馬遜兩步驗證有哪些驗證方法?

亞馬遜通常提供多種兩步驗證的方式,包括短信(通過手機接收驗證碼)和認證器應用程序(如Google Authenticator、Authy等)。選擇你偏好的方式。 短信驗證: 如果選擇短信驗證,需要將你的手機號碼關聯…

YOLOv8改進 | 2023 | LSKAttention大核注意力機制助力極限漲點

論文地址:官方論文地址 代碼地址:官方代碼地址 一、本文介紹 在這篇文章中,我們將講解如何將LSKAttention大核注意力機制應用于YOLOv8,以實現顯著的性能提升。首先,我們介紹LSKAttention機制的基本原理,…

loginctl - 控制 systemd 登錄管理器

loginctl loginctl用途loginctl安裝開啟loginctl服務session操作user操作管理用戶服務 loginctl - Control the systemd login manager Redhat/centos平臺使用loginctl管理登錄用戶與session loginctl用途 控制 systemd 登錄管理器管理當前登錄的用戶和session loginctl安裝…

Peter算法小課堂—高精度加法

指針與數組 看看以下代碼&#xff0c;請預測答案 #include <bits/stdc.h> using namespace std; int x[10]{0,1,2,3,4,5,6,7,8,9}; int main(){cout<<x<<endl;cout<<x3<<endl;cout<<*x<<endl;cout<<*(x7)<<endl;cout&…

定制手機套餐---python序列

if __name__ __main__:print("定制手機套餐")print("")#定義電話時長&#xff1a;字典callTimeOptions{1:0分鐘,2:50分鐘,3:100分鐘,4:300分鐘,5:不限量}keyinput("請輸入電話時長的選擇編號&#xff1a;")valuecallTimeOptions.get(key)if val…

代碼隨想錄算法訓練營第五十四天|392.判斷子序列 115.不同的子序列

文檔講解&#xff1a;代碼隨想錄 視頻講解&#xff1a;代碼隨想錄B站賬號 狀態&#xff1a;看了視頻題解和文章解析后做出來了 392.判斷子序列 class Solution:def isSubsequence(self, s: str, t: str) -> bool:dp [[0] * (len(t)1) for _ in range(len(s)1)]for i in ra…

Java 關于批量插入遇到的問題 -sqlserver

序言&#xff1a; 我們在做項目的時候&#xff0c;經常會遇到&#xff0c;對數據的新增動作&#xff0c;如果數據量很少的情況下&#xff0c;單個新增對性能還好&#xff0c;但是一旦涉及到 大數據量&#xff0c;如十萬&#xff0c;百萬&#xff0c;千萬&#xff0c;這個時候如…

RabbitMq使用與整合

MQ基本概念 MQ概述 MQ全稱 Message Queue&#xff08;[kju?]&#xff09;&#xff08;消息隊列&#xff09;&#xff0c;是在消息的傳輸過程中保存消息的容器。多用于分布式系統之間進行通信。 &#xff08;隊列是一種容器&#xff0c;用于存放數據的都是容器&#xff0c;存…

優秀的時間追蹤軟件Timemator for Mac輕松管理時間!

在現代社會&#xff0c;時間管理成為了我們工作和生活中的一大挑戰。如果你經常感到時間不夠用&#xff0c;無法高效地完成任務&#xff0c;那么Timemator for Mac將成為你的得力助手。 Timemator for Mac是一款出色的時間追蹤軟件&#xff0c;它可以幫助你精確記錄和管理你的…

Linux的基本指令 ( 一 )

目錄 前言 Linux基本指令 快速認識五個指令 ls指令 補充內容 pwd指令 補充內容 cd指令 補充內容 重新認識指令 指令的本質 which指令 alias指令 最后 一個文件的三種時間 tree指令及安裝 tree指令 前言 關于Linux操作系統的桌面&#xff0c;在學校教學中我們…