1.前言
花了好几天的时间去学习数据挖掘里面的主成分分析(principal component analysis , PCA)。PCA是一种常用的无监督学习方法,他作为一种数据降维的方法是很有效的。选择的数据集很经常的都是高维数据,处理起来要么就是处理时间太慢,要么就是训练出来的学习模型精度会很低。同时,这些高维数据里面就有的数据是不相关的,这些特征(维)是我们不需要的。那么对于这种情况,降维是必须的。

2.主成分分析算法
据《统计学习方法》一书的表达:“主成分分析是利用正交变换把由线性相关变量表示的观测数据转换为少数几个由线性无关变量表示的数据,线性无关的变量称为主成分。”按我的理解,就是将所有的高维数据点,通过投影映射的方法,将数据点转换至一个新的坐标系,而这个坐标系的维度是小于或等于原先的坐标系维度的。同时,找到这个我们想要的坐标系的标准就是,在新坐标系中,投影后的数据对应的每个坐标轴上的数据的方差和都是最大的,这样我们保存下来的数据就是最完整的。而为了找到这个坐标轴,我们可以拆分子问题,先找第一个坐标轴,第二个…知道找到想要的结果。这里的第一坐标轴,就称为是第一主成分,以此类推。

3.总体主成分的定义(a = (a1 , a2 , … , ak)T ,其中a1 , a2 , … 都是一组n维向量)T:
满足以下三点:
一、每一个向量a1都是单位向量
二、a矩阵中的每一个向量a1 , a2 , …两两的协方差均为0,即他们之间互不相关
三、a1是x数据的所有线性变换中方差最大的,a2是与a1无关的x的所有线性变换中方差和最大的…

4.数学推导
一、针对某个均值为0的数据集x中,找到一个相对于当前x方差最大的主成分,也就是一个坐标轴,坐标轴的方向向量是w = (w1 , w2 , w3 ,…,wn)

得到方差函数f(x)
二、针对当前的方差函数,求出他的最大值,即方差最大化,用的是梯度上升的方法进行寻找。对多元函数的极值,还是同样的方法,求偏导。
三、当求出一个主成分,想求下一个主成分,此时应先对当前的x进行操作,就是使得新的x与刚刚的主成分无关,这样才确保求出来的新的主成分是和原来的主成分是不相关的。

四、不断循环上述过程,直到得到自己预想数量的总体主成分

5.PCA代码

import numpy as npclass PCA:def __init__(self , n_components):assert n_components >= 1 , "The number of n is not valid."self.n_components = n_componentsself.components_ = None#对这个PCA实例,传入一个待主成分分析的矩阵X,用PCA来适应这个X,提取出他的k个主成分(k个方向向量)#保存再PCA实例的components里面,是个k*n维矩阵,k是主成分的个数,n是X的列数def fit_(self , X1):assert X1.shape[1] >= self.n_components , "It's not legal."# 对数据进行demean操作,使得数据在各个特征下的均值为0def demean(X):return X - np.mean(X , axis = 0)# 求数据点投影到一个方向向量后的方差,这个函数越大越可取def f(X , w):return ((np.sum(X.dot(w))) ** 2 ) / X.shape[0]# 求方差的导数,用这个得到一个对w向量每一个项的导数,返回的也是一个n维的向量def df(X , w):return (X.T.dot(X.dot(w))) * 2. / X.shape[0]# 对w进行单位化def direction(w):return w / np.linalg.norm(w)# 得到下一个主成分的方法,就是将原先的数据点除去前一个主成分方向上的数值,具体就是# 针对某一个点X(i),他在前一个主成分W上的投影是Xproject,然后紧接着就可以做差X(i) - X(i)project得到去除第一主成分的矩阵def delete_pca(X , w):X2 = np.empty(X.shape)for i in range(0 , X.shape[0]):X2[i] = X[i] - (X[i].dot(w)) * wreturn X2##梯度上升法求出最佳的向量w,也就是最佳的参数def get_next_pca(X , initial_w , eta = 0.01 , n_iter = 1e4 , epional = 1e-8):w = direction(initial_w)count = 0while count < n_iter:history_w = wgradient = df(X , w)w = w + eta * gradientw = direction(w)if(abs(f(X , history_w) - f(X , w)) < epional):breakcount += 1return w# 如果是想得到n个主成分,通过一次调用函数就想得出def get_n_pca(X, n , eta = 0.01 , n_iter = 1e4 , epional = 1e-8):X_pca = X.copy()#注意这里的W矩阵(里面包括n个方向向量w,即前n个主成分)的矩阵大小,一共有n行(前n个主成分),并且有X.shape[1]行total_w = np.empty((self.n_components , X.shape[1]))for i in range(0 , n):initial_w = np.random.random(X.shape[1])w = get_next_pca(X_pca , initial_w)for j in range(0 , len(w)):total_w[i,j] = w[j]X_pca = delete_pca(X_pca , w)return total_wX1 = demean(X1)self.components_ = get_n_pca(X1 , self.n_components)return self#当PCA已经fit之后,可以用此PCA来转化X得到将维后的矩阵Xdef tranport(self , X):print(self.components_)return X.dot(self.components_.T)

6.scikit-learn封装的PCA类使用

pca = PCA(0.95)
pca.fit(X_train)
X_train_reduction = pca.transform(X_train)
X_test_reduction = pca.transform(X_test)

数据挖掘学习--主成分分析相关推荐

  1. 【数据挖掘】数据挖掘简介 ( 6 个常用功能 | 数据挖掘结果判断 | 数据挖掘学习框架 | 数据挖掘分类 )

    文章目录 I . 数据挖掘 功能 II . 数据挖掘 结果判断 III . 数据挖掘 学习框架 IV . 数据挖掘 分类 I . 数据挖掘 功能 1 . 概念描述 ( Concept Descript ...

  2. python数据挖掘学习笔记】十九.鸢尾花数据集可视化、线性回归、决策树花样分析

    #2018-04-05 16:57:26 April Thursday the 14 week, the 095 day SZ SSMR python数据挖掘学习笔记]十九.鸢尾花数据集可视化.线性回 ...

  3. python数据挖掘学习笔记】十六.逻辑回归LogisticRegression分析鸢尾花数据

    但是很多时候数据是非线性的,所以这篇文章主要讲述逻辑回归及Sklearn机器学习包中的LogisticRegression算法 #2018-03-28 16:57:56 March Wednesday ...

  4. python数据挖掘学习】十五.Matplotlib调用imshow()函数绘制热图

    python数据挖掘学习]十五.Matplotlib调用imshow()函数绘制热图 #2018-03-28 14:47:19 March Wednesday the 13 week, the 087 ...

  5. python数据挖掘学习笔记】十四.Scipy调用curve_fit实现曲线拟合

    #2018-03-28 10:02:08 March Wednesday the 13 week, the 087 day SZ SSMR python数据挖掘学习笔记]十四.Scipy调用curve ...

  6. python数据挖掘学习笔记】十三.WordCloud词云配置过程及词频分析

    #2018-03-28 09:59:40 March Wednesday the 13 week, the 087 day SZ SSMR 11,12因为涉及到数据库被我暂时放弃了 python数据挖 ...

  7. python数据挖掘学习笔记】十.Pandas、Matplotlib、PCA绘图实用代码补充

    #2018-03-23 18:56:38 March Friday the 12 week, the 082 day SZ SSMR https://blog.csdn.net/eastmount/a ...

  8. Python数据挖掘学习笔记】九.回归模型LinearRegression简单分析氧化物数据

    #2018-03-23 16:26:20 March Friday the 12 week, the 082 day SZ SSMR [Python数据挖掘学习笔记]九.回归模型LinearRegre ...

  9. 数据挖掘学习笔记 5 线性回归知识及预测糖尿病实例

    #2018-03-21 16:45:01 March Wednesday the 12 week, the 080 day SZ SSMR http://blog.csdn.net/eastmount ...

  10. DataWhale数据挖掘学习--Task 2 数据分析

    EDA数据分析 2.1 数据加载 2.2 查看数据概况 2.3 检测缺失值.异常值.重复值 2.3.1 缺失值判断 2.3.2 缺失值可视化 missingno矩阵查看缺失值 missingno条形图 ...

最新文章

  1. 2016-8-13第二周作业
  2. 北京大学启用人脸识别系统:学生“刷脸”入校
  3. vue重启node_【ts】vue-typescript-admin类型any仍然报错
  4. 【使用递归玩通关汉诺塔游戏】算法01-递归(斐波那契数列、汉罗塔问题)-java实现
  5. docker的容器管理和网络模式
  6. 红旗Linux可以兼容,红旗 Linux 桌面操作系统11来了:支持国产自主CPU,全新UI风格设计,兼容面广...
  7. Spark SQL 中UDF的讲解
  8. permutation 1(HDU-6628)
  9. IT兄弟连 JavaWeb教程 Servlet 状态管理 会话跟踪
  10. 如何使用 OpManager 进行磁盘空间监控?
  11. 我对SegNet的理解
  12. 阿里巴巴矢量图标引入方法
  13. 坚持整洁亦或拥抱混乱——新书《混乱: 改变我们生活的无序力量》解读
  14. 1000行代码入门python-小白入门篇,Python到底是什么?
  15. CAD画图教程,手把手教你画“鱼”
  16. kubernet-- windows之kubectl的安装及使用(巧克力)
  17. jquerykindeditor文本编辑器插件
  18. input按钮onclick事件大全
  19. Non-resolvable parent POM for com.example:demo:0.0.1-SNAPSHOT: Could not transfer artifact org.sprin
  20. 一个技术青年的网络失足

热门文章

  1. 解压ubi文件_UBI文件系统
  2. 新媒体时代,内容为王已经走偏
  3. c语言 一元多项式展开括号,一元多项式Polynomial的C语言实现
  4. 曲苑杂坛--DML操作中如何处理那些未提交的数据
  5. 安全性测试(一)--网页安全检查
  6. 计算机网络验证性实践
  7. iperf/LANSpeedTest网络传输速度测试工具
  8. 团队管理14--盘点团队
  9. Windows 7 登录界面背景图片定制
  10. 多种方法在Markdown加入上划线、中划线、下划线