pca是一种黑箱子式的降维方式,通过映射,希望投影后的数据尽可能的分散, 因此要保证映射后的方差尽可能大,下一个映射的方向与当前映射方向正交

pca的步骤:

第一步: 首先要对当前数据(去均值)求协方差矩阵,协方差矩阵= 数据*数据的转置/(m-1) m表示的列数,对角线上表示的是方差,其他位置表示的是协方差

第二步:需要通过矩阵对角化,使得协方差为0,只存在对角线方向的数据,这个时候就能得到我们的特征值和特征向量

第三步: 将当前数据*特征向量就完成了降维工作,特征值/特征值之和, 可以表示特征值对应特征向量的表达重要性

下面是程序的说明

第一步:数据导入, 去均值, 求协方差

import pandas as pd
import  numpy as np
import matplotlib.pyplot as pltdf = pd.read_csv('iris.data')
print(df.head())df.columns=['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid', 'class']
print(df.head())# 用来储存变量
X = df.ix[:, 0:4].values
#用来储存标签
y = df.ix[:, 4].values   msg ={'Iris-setosa':0, 'Iris-versicolor':1, 'Iris-virginica':2}
df['class'] = df['class'].map(msg)  #把字母换成数字#进行标准化
from sklearn.preprocessing import StandardScaler
Scaler = StandardScaler()
X_Scaler = Scaler.fit_transform(X)# 求每一行的均值
mean_vec = np.mean(X_Scaler, axis=0)
#去均值后求协方差矩阵
cov_mat = (X_Scaler-mean_vec).T.dot(X_Scaler-mean_vec)/(X_Scaler.shape[0]-1)
print(cov_mat)
#使用np求协方差矩阵,结果是一样的
cov_mat = np.cov(X_Scaler.T)
print(cov_mat)

第二步:求矩阵对角化的过程,就是一个求特征值和特征向量的过程

# 求特征值和特征向量
eig_vals, eig_vecs = np.linalg.eig(cov_mat)
print(eig_vals, eig_vecs)#将特征值与特征向量合并
eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:, i]) for i in range(len(eig_vals))] #组合对应
eig_pairs.sort(key=lambda x:x[0], reverse=True)tot = sum(eig_vals)var_exp = [(i/tot)*100 for i in sorted(eig_vals, reverse=True)]
#cumsum表示每前两个数相加
cum_var_exp = np.cumsum(var_exp)
#画图
plt.figure(figsize=(6, 4))
#画柱状图
plt.bar(range(4), var_exp, alpha=0.5, align='center',label='individual explained variance')
#画步阶图
plt.step(range(4), cum_var_exp, where='mid',label='cumulative explained variance')
plt.ylabel('Explained variance ratio')
plt.xlabel('Principal components')
plt.legend(loc='best')
plt.tight_layout()

第三步:将数据(去均值)

#把4维矩阵降低到两维,取前两个特征向量组合转置点乘即可#np.hstack合并两个向量,reshape让一行变成一列,相当于转置
matrix_w = np.hstack((eig_pairs[0][1].reshape(4,1),eig_pairs[1][1].reshape(4,1)))#变换以后的矩阵149*4 .dot 4*2 = 149*2
become_X_Scaler = X_Scaler.dot(matrix_w)
print(become_X_Scaler)
plt.figure(figsize=(6, 4))color = np.array(['red', 'green', 'blue']) #构成行列式
plt.scatter(become_X_Scaler[:,0], become_X_Scaler[:,1], c=color[df['class']])  #画出种类对应颜色的散点图
plt.show()

转载于:https://www.cnblogs.com/my-love-is-python/p/9532249.html

跟我学算法-pca(降维)相关推荐

  1. 机器学习算法-PCA降维技术

    机器学习算法-PCA降维 一.引言 在实际的数据分析问题中我们遇到的问题通常有较高维数的特征,在进行实际的数据分析的时候,我们并不会将所有的特征都用于算法的训练,而是挑选出我们认为可能对目标有影响的特 ...

  2. 12- 降维算法 (PCA降维/LDA分类/NMF) (数据处理)

    数据降维就是一种对高维度特征数据预处理方法.降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的. PCA算法有两种实现方法: 基于特征值分解协方差矩阵实 ...

  3. 10 降维算法(PCA降维/LDA分类/NMF非负矩阵)

    数据降维简介 降维就是一种对高维度特征数据预处理方法.降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的. 降维具有如下一些优点: 减少所需的存储空间. ...

  4. 数学推导+纯Python实现机器学习算法26:PCA降维

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作为一种常见的多元统计分析方法,主成分分析法(Principal ...

  5. 【白话机器学习】算法理论+实战之PCA降维

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支 ...

  6. 机器学习-Sklearn-04(降维算法PCA和SVD)

    机器学习-Sklearn-04(降维算法PCA和SVD) 学习04 1 概述 1.1 从什么叫"维度"说开来 对于数组和Series来说,维度就是功能shape返回的结果,shap ...

  7. 白话机器学习算法理论+实战之PCA降维

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,比如我之前写过的一篇十大机器学习算法的小总结,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑 ...

  8. sklearn实战之降维算法PCA与SVD

    sklearn实战系列: (1) sklearn实战之决策树 (2) sklearn实战之随机森林 (3) sklearn实战之数据预处理与特征工程 (4) sklearn实战之降维算法PCA与SVD ...

  9. 降维算法PCA和SVD

    文章目录 前言 PCA和SVD 1. 降维算法的实现 1.1 降维的步骤表格 2. PCA,SVD简单概述 3. 重要参数 n_components 3.1 迷你案例:高维数据的可视化 3.1.1 调 ...

  10. ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能

    ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 estimator = PC ...

最新文章

  1. 机器学习算法与技术简介
  2. tar打包及打包并压缩
  3. 利用systemd 实现 tomcat 多实例
  4. java+循环的时候用标签_java中循环标签的使用
  5. 页面中嵌入了Flash时滚动条问题
  6. groovy import java_在Java中调用Groovy方法的又一种方法:使用接口
  7. E. Turn Off The TV Educational Codeforces Round 29
  8. 小型elf Hello,World程序
  9. 设置 cell点击 背景色
  10. idea maven丢失
  11. include问题及错误解决
  12. 长沙好吃的地方?这个好吃的地方你可能真的没来过
  13. ro服务器物品掉率修改,给冒险者们的一封致歉信 社交服务器持续优化 仙境传说手游常见BUG解答...
  14. java视频转换flv_java使用ffmpeg转换视频为flv文件
  15. Mysql语句优化的原则——让你写sql更加顺手
  16. 士兵队列训练问题 (队列 c++)
  17. OSChina 周三乱弹 ——身为同事就要互相伤害么?
  18. 第九章计算机网络安全(完结撒花)
  19. Android开发知识体系,技术实现
  20. 计算1+2+3+...+99+100的总和

热门文章

  1. 数据结构(三)树、二叉树、最优二叉树
  2. php中对文件的读取和写入
  3. 第十三次CCFCSP认证(2018年3月)真题碰撞的小球
  4. Python工具——tqdm:进度条
  5. 【ArcGIS|空间分析】志愿者分配管理区域内共享单车(全国大学生GIS技能大赛试题)
  6. fopen php 读取_PHP fopen读取url内容
  7. 罗盘时钟制作代码_抖音超火的姓氏罗盘壁纸,安卓和苹果都能做
  8. PHP邮件扩展,PHP邮件扩展:mailpp
  9. 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
  10. php mysql源码包,linux下Apache+PHP+mysql+phpMyAdmin源码包安装配置