PCA,LDA基础+sklearn 简单实践

  • 1.PCA+sklearn.decomposition.PCA
    • 1.PCA理论基础
    • 2.sklearn.decomposition.PCA简单实践
  • 2.LDA+sklearn.discriminant_analysis.LinearDiscriminantAnalysis
    • 2.1 LDA理论基础
    • 2.2 sklearn LDA简单实践

1.PCA+sklearn.decomposition.PCA

1.PCA理论基础

PCA:(principal component analysis)无监督线性降维算法,通过投影减少数据的特征数。投影方向是数据投影后方差最大的方向(重构误差最小的方向/坐标轴相关度)

投影方差最大理论:在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。

最小平方理论:点到线的距离平方和越小越好(具体推导)。

两种理论都能推出同一个算法:协方差矩阵求均值。

step1:原特征向量去中心化:x=x^−x‾x=\hat{x}-\overline{x}x=x^−x,去中心化,使得投影后的样本均值为0;

step2: 投影后求方差,uuu投影方向的单位向量:uTx∗uTx=>uTx∗xTu=>∑iuTxi∗xiTu=uT∑uu^Tx*u^Tx=>u^Tx*x^Tu=>\sum_i u^Tx_i*x_i^Tu=u^T\sum uuTx∗uTx=>uTx∗xTu=>∑i​uTxi​∗xiT​u=uT∑u(单个样本方差=>all sample方差);

step3:带约束问题拉格朗日乘子法:uT∑u+λ(1−uTu)u^T\sum u+\lambda(1-u^Tu)uT∑u+λ(1−uTu);

step4:求最大,对上式求导为0 : ∑u=λu\sum u = \lambda u∑u=λu;

由上式子可得最大投影方向为协方差矩阵的最大特征值对的特征向量,依次类推,可以得到第二大投影方向,第k大投影方向。

取特征值topk大的k个特征向量,组成一个kn的投影矩阵M,Mx可以得到k*1维的向量,作为原来向量的低维度的等价表示形式。

2.sklearn.decomposition.PCA简单实践

如果数据的各个维度的特征不一致,需要先做Z-sore Normalization(减均值除方差)。具体原因可参考博文:https://www.jianshu.com/p/c21c0e2c403a

sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)

PCA对象的初始化参数
n_components nums/ string,default=None,所有成分被保留。 n_components > 1降维后的维度;0< n_components<1将自动选取特征个数n,使得满足所要求的方差百分比。
copy 是否在运行算法时,将原始训练数据复制一份
whiten 是否对降维后的数据的每个特征进行归一化
PCA对象方法
fit(x) 用x训练PCA 对象pca.fit(x)
transform(x) 训练好PCA对象后用pca.transform(x)进行降维
fit_transform(x) 用x来训练PCA模型,同时返回降维后的数据x_reduced= pca.fit_transform(x)
inverse_transform() 将降维后的数据转换成原始数据 x = pca.inverse_transform(x_reduced)
PCA对象的属性
pca.components_ k个特征向量
pca.n_components_ 特征向量的数量 k
pca.explained_variance_ 往各个特征向量方向投影后的方差
pca.explained_variance_ratio_ 各个特征值占总特征值的比例 ?

鸢尾花降维算法demo:鸢尾花数据特征是4维的,共三类样本。

import matplotlib.pyplot as plt
import sklearn.decomposition as dp
from sklearn.datasets.base import load_iris
from mpl_toolkits.mplot3d import Axes3D
plt.switch_backend('agg')# 鸢尾花数据一共有三个类别
n = 3  # 降到n维度
x,y=load_iris(return_X_y=True)
pca=dp.PCA(n_components=n)reduced_x=pca.fit_transform(x)# PCA对象的一些属性
print(pca.explained_variance_ratio_,sum(pca.explained_variance_ratio_)) # 各个特征值占总特征值的比例?
print(pca.explained_variance_)  # 各个特征向量方向投影后的方差
print(pca.n_components_)  # 特征向量的数量 k
print(pca.components_)  # k个特征向量red_x,red_y,red_z = [], [], []
blue_x,blue_y, blue_z = [], [], []
green_x,green_y, green_z = [], [], []# 将同一个类别的数据绘制成同一个元素
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])red_z.append(reduced_x[i][2])elif y[i]==1:blue_x.append(reduced_x[i][0])blue_y.append(reduced_x[i][1])blue_z.append(reduced_x[i][2])else:green_x.append(reduced_x[i][0])green_y.append(reduced_x[i][1])green_z.append(reduced_x[i][2])
figure = plt.figure()
ax1 = figure.add_subplot(1,2,1)
ax2 = figure.add_subplot(1,2,2,projection='3d')# 两个主成分,二维图像
ax1.scatter(red_x,red_y,c='r',marker='x')
ax1.scatter(blue_x,blue_y,c='b',marker='D')
ax1.scatter(green_x,green_y,c='g',marker='.')# 三个主成分,三维图像,更高维度的不好显示
ax2.scatter3D(red_x,red_y,red_z,c='r',marker='x')
ax2.scatter3D(blue_x,blue_y,blue_z, c='b',marker='D')
ax2.scatter3D(green_x,green_y,green_z, c='g',marker='.')
plt.savefig("./pca_iris_test.png")
plt.close()

输出

[0.92461872 0.05306648 0.01710261] 0.9947878161267246
[4.22824171 0.24267075 0.0782095 ]
3
[[ 0.36138659 -0.08452251  0.85667061  0.3582892 ][ 0.65658877  0.73016143 -0.17337266 -0.07548102][-0.58202985  0.59791083  0.07623608  0.54583143]]```

2.LDA+sklearn.discriminant_analysis.LinearDiscriminantAnalysis

2.1 LDA理论基础

LDA–Linear Discriminant Analysis,线性判别分析。有监督的降维过程,依据类别选择降维方向。
降维方向选择依据:Fisher准则,类内离散程度越小,类间离散程度越大.
FDR=(μ1−μ2)2σ12+σ22FDR=\frac{(\mu_1-\mu_2)^2}{\sigma_1^2+\sigma_2^2}FDR=σ12​+σ22​(μ1​−μ2​)2​

式中都是投影后的统统计量,引入投影前特征向量x和投影方向u:
(μ1−μ2)2=uT(μ‾1−μ‾2)(μ‾1−μ‾2)Tu:=uTSbu(\mu_1-\mu_2)^2=u^T(\overline\mu_1-\overline\mu_2)(\overline\mu_1-\overline\mu_2)^Tu := u^TS_bu(μ1​−μ2​)2=uT(μ​1​−μ​2​)(μ​1​−μ​2​)Tu:=uTSb​u

σi2=uTΣiu−>σ12+σ22:=uTSwu\sigma_i^2=u^T\Sigma_iu->\sigma_1^2+\sigma_2^2:= u^TS_wuσi2​=uTΣi​u−>σ12​+σ22​:=uTSw​u

则FDR可以写维:
FDR=uTSbuuTSwuFDR=\frac{u^TS_bu}{u^TS_wu}FDR=uTSw​uuTSb​u​

其中:类内散度矩阵:sw=Σ1+Σ2s_w=\Sigma_1+\Sigma_2sw​=Σ1​+Σ2​
类间散度矩阵:sb=(μ‾1−μ‾2)(μ‾1−μ‾2)s_b = (\overline\mu_1-\overline\mu_2)(\overline\mu_1-\overline\mu_2)sb​=(μ​1​−μ​2​)(μ​1​−μ​2​)

上式子为广义瑞丽熵,有解析解:最优解的条件:
Sbu=λSwuS_b u=\lambda S_w uSb​u=λSw​u

二分类问题u=sw−1(μ‾1−μ‾2)(μ‾1−μ‾2)u=s_w^{-1}(\overline\mu_1-\overline\mu_2)(\overline\mu_1-\overline\mu_2)u=sw−1​(μ​1​−μ​2​)(μ​1​−μ​2​)
详细推导不详,参考资料:https://www.cnblogs.com/pinard/p/6244265.html

LDA key point:
1)找降维后最容易分类的方向
2)只能降到min(sample nums, class num-1), 二分类就只能降到1维。

2.2 sklearn LDA简单实践

def demo_lda(x,y,n=3):lda = LinearDiscriminantAnalysis(n_components=n)lda.fit(x,y)reduced_x = lda.transform(x)index_list = []for i in range(n):index_list.append("com%d"%i)reduced_data = pd.DataFrame(reduced_x, columns = index_list)reduced_data["label"] = yreduced_data.to_csv("lda_%dcom_open.csv"%n)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])figure = plt.figure()ax1 = figure.add_subplot(1,2,1)# 两个主成分,二维图像ax1.scatter(red_x,red_y,c='r',marker='x')ax1.scatter(blue_x,blue_y,c='b',marker='D')ax1.scatter(green_x,green_y,c='g',marker='.')plt.savefig("./lda_iris_test.png")plt.close()if __name__ == "__main__":n = 2  # 降到n维度x,y=load_iris(return_X_y=True)demo_lda(x,y,n)

参考博文:
PCA:
https://blog.csdn.net/u012102306/article/details/52294726
https://www.cnblogs.com/youngsea/p/9334773.html
https://www.jb51.net/article/181205.htm
LDA:
https://zhuanlan.zhihu.com/p/161556242
sklearn 中的降维算法:https://www.cnblogs.com/LUOyaXIONG/gallery/image/259967.html

MachineLearning(8)-PCA,LDA基础+sklearn 简单实践相关推荐

  1. MachineLearning(7)-决策树基础+sklearn.DecisionTreeClassifier简单实践

    sklearn.DecisionTreeClassifier决策树简单使用 1.决策树算法基础 2.sklearn.DecisionTreeClassifier简单实践 2.1 决策树类 2.3 决策 ...

  2. 基于PCA与LDA的数据降维实践

    基于PCA与LDA的数据降维实践 描述 数据降维(Dimension Reduction)是降低数据冗余.消除噪音数据的干扰.提取有效特征.提升模型的效率和准确性的有效途径, PCA(主成分分析)和L ...

  3. 模式识别与机器学习(作业5)基于PCA–LDA的人脸识别

    基于PCA–LDA的人脸识别 ORC数据集 提取码: cggh 本次的实验是在模式识别与机器学习(作业4),PCA降维的基础上加入了线性判别分析,对维度进行了进一步的降低. 1. 导入数据 一共有40 ...

  4. 【机器学习】基于PCA/LDA的数据降维和可视化(二维+三维)

    基于PCA/LDA的数据降维和可视化 Introduction Project Intro File Intro Tools Intro Code&Dataset Link Process P ...

  5. C++(11)--编程实践1-经典养成类游戏简单实践

    经典养成类游戏简单实践-小公主养成记 <老九学堂C++课程>学习笔记.<老九学堂C++课程>详情请到B站搜索<老九零基础学编程C++入门> ------------ ...

  6. 运用京东云代码托管、云编译、云部署等产品进行蓝绿部署简单实践

    干货 | 运用京东云代码托管.云编译.云部署等产品进行蓝绿部署简单实践 前几天我们以一种较为传统的方式在京东云上简单实践了基于Jenkins+Docker+Git 的CI流程,主要利用一些开源技术来实 ...

  7. 干货 | 如何在京东云上简单实践CI流程

    如何在京东云上简单实践CI流程 在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要.目前已经形成一套标准的流程,最重要的组成部分就是持续集成及持续交付.部署.在此,我们在 ...

  8. 马尔科夫模型在Gowalla数据集下的简单实践

    马尔科夫模型在Gowalla数据集下的简单实践 马尔科夫模型实践第一战 基础知识 数学知识 代码知识 数据处理 单独一次转移的概率计算函数设计 生成转移概率矩阵 生成初始向量 结论 马尔科夫模型实践第 ...

  9. OpenGL.ES在Android上的简单实践:10-曲棍球(拖动物体、碰撞测试)

    OpenGL.ES在Android上的简单实践:10-曲棍球(拖动物体.碰撞测试) 1.让木槌跟随手指移动 继续上一篇文章9的内容.既然可以测试木槌是否被触碰了,我们将继续努力下去:当我们来回拖动木槌 ...

最新文章

  1. mysql的外键探讨
  2. Computational methods for analysis of single molecule sequencing data
  3. git回滚到历史版本,并且删除本地untracked file
  4. java中直角三角形第三条边,Java编程,根据输入三角形的三个边边长,程序能判断三角形类型为:等边、等腰、斜角、直角三角形,求代码...
  5. html写原生曲线图,HTML5 平滑的正弦波曲线图
  6. python中不论类的名字是什么歌_Python自动猜歌名,还愁排名上不去嘛?
  7. 050666 获取tableview的cell
  8. spark的ContextCleaner清理
  9. 将三角形绕点b顺时针旋转90度_模型 | 图形旋转与翻折题型汇编
  10. PHP安全新闻早8点_1127
  11. python set 原理_Python基础教程之dict和set
  12. 斯坦福大学CS143编译原理课程笔记:1.编译器与解释器简介
  13. 这些Python骚操作,你知道吗?
  14. json标准格式举例_JSON 数据格式详解
  15. 小白网安学习日记(2) hacknet游戏(模拟黑客入侵的游戏)
  16. python实现:无刻度的一大一小水罐取水问题
  17. django 模型choice基本讲解
  18. 开源软件学习交流计划 (西游记项目)
  19. 如何计算IT投资回报(ROI)
  20. 红米4a android p,一图彻底看懂红米4/红米4A

热门文章

  1. 错误./hello: error while loading shared libraries: libQtGui.so.4: cannot open shared object file:
  2. wince使用自定义字体
  3. 十六进制除法运算法则_苏教版数学七年级上册 微课视频 2.6 有理数的乘法与除法(1)...
  4. 测试鼠标双击_鼠标环境可靠性测试是什么
  5. @autowired注解 抽象类_别再用ifelse了,用注解去代替他吧
  6. 初学者怎样看懂python代码_入门编程(初学者怎样看懂代码)
  7. 【转】医学影像处理相关知识整理(一)
  8. Web Reference和Service Reference的区别
  9. php接口datatype= text,关于php:dataType:“json”不起作用
  10. ntnub原理怎么看_老电工由浅入深带你入门学PLC的工作原理和梯形图的编程规则...