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

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 uuTxuTx=>uTxxTu=>iuTxixiTu=uTu(单个样本方差=>all sample方差);

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

step4:求最大,对上式求导为0 : ∑u=λu\sum u = \lambda uu=λ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_componentsnums/ 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:=uTSbu

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

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

其中:类内散度矩阵: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 uSbu=λSwu

二分类问题u=sw−1(μ‾1−μ‾2)(μ‾1−μ‾2)u=s_w^{-1}(\overline\mu_1-\overline\mu_2)(\overline\mu_1-\overline\mu_2)u=sw1(μ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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode198 打家劫舍

你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋存放金额的…

linux下的RPC

一、概述 在传统的编程概念中&#xff0c;过程是由程序员在本地编译完成&#xff0c;并只能局限在本地运行的一段代码&#xff0c;也即其主程序和过程之间的运行关系是本地调用关系。因此这种结构在网络日益发展的今天已无法适应实际需求。总而言之&#xff0c;传统过程调用模式…

算法(28)--矩阵搜索系列

矩阵搜索1.leetcode-200. 岛屿数量2.leetcode-695. 岛屿的最大面积3.leetcode-463. 岛屿的周长4.剑指 Offer 12. 矩阵中的路径5.leetcode-329. 矩阵中的最长递增路径6.leetcode-1091. 二进制矩阵中的最短路径1.leetcode-200. 岛屿数量 给你一个由 ‘1’&#xff08;陆地&#…

leetcode213 打家劫舍II

你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈&#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚…

PaperNotes(4)-高质量图像生成-CGAN-StackGAN-Lapgan-Cyclegan-Pix2pixgan

cgan,stackgan,lapgan,cyclegan,pix2pixgan1.Conditional GAN1.1简介1.2网络结构与训练1.3特点与用途2.Stack GAN2.1简介2.2网络结构与训练2.3特点与用途3.Lap GAN3.1简介3.2网络结构与训练3.3特点与用途4.Pix2pix GAN4.1 简介4.2 网络结构和训练4.3 特点和用途5.Patch GAN6.Cy…

leetcode206 反转链表

反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题&#xff1f; 经典题不解释 /*** Definition for singly-linked list.* public class ListNode…

leetcode 152 乘积最大子序列

给定一个整数数组 nums &#xff0c;找出一个序列中乘积最大的连续子序列&#xff08;该序列至少包含一个数&#xff09;。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子…

PaperNotes(5)-Conditional Generative Adversarial Nets

Conditional GAN 论文阅读笔记Abstract1 Introduction2 Related Work3 Conditional Adversarial Nets3.1 Generative Adversarial Nets3.2 Conditional Adversarial Nets4 Experimental Results4.1 Unimodal4.2 Multimodal5 Future Work6.思考文章地址&#xff1a;https://arxi…

蛙泳姿势教学

偶尔看到分享的一篇日志&#xff0c;记录下&#xff0c;忙过这段时间努力学蛙泳。 蛙泳配合有一个顺口溜&#xff0c;在讲解蛙泳动作要领之前先介绍给大家&#xff1a;“划手腿不动&#xff0c;收手再收腿&#xff0c;先伸胳膊后蹬腿&#xff0c;并拢伸直漂一会儿。”从顺口溜中…

leetcode238 除本身以外数组的乘积

给定长度为 n 的整数数组 nums&#xff0c;其中 n > 1&#xff0c;返回输出数组 output &#xff0c;其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。 示例: 输入: [1,2,3,4] 输出: [24,12,8,6] 说明: 请不要使用除法&#xff0c;且在 O(n) 时间复杂度内完…

C++(2)--mac使用VScode 进行C++编译、运行、调试

mac 使用VScode 进行C开发1.编译的基础概念2. mac 编译c代码2.1 查看编译器情况2.2 安装插件C/C&#xff0c;C/C Clang Command Adapte2.3新建一个C project2.3.1本地新建文件夹2.3.2新建mian.cpp文件2.3.3 编写hello word demo2.4 代码编译&#xff0c;运行&#xff0c;调试2.…

leetcode136 只出现一次的数字

给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 说明&#xff1a; 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗&#xff1f; 示例 1: 输入: [2,2,1] 输出: 1 示例 2: …

leetcode94 二叉树的中序遍历

给定一个二叉树&#xff0c;返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单&#xff0c;你可以通过迭代算法完成吗&#xff1f; 递归 /*** Definition for a binary tree node.* public class TreeNode …

leetcode647 回文子串

给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被计为是不同的子串。 示例 1: 输入: "abc" 输出: 3 解释: 三个回文子串: "a", "…

windows下关于Objective-C开发环境的配置

最近IOS一直很火&#xff0c;也想学习以以下OC开发&#xff0c;一般装个虚拟机&#xff0c;然后装个mac&#xff0c;我相信大多数人的机子跑不起来或者很卡&#xff0c;所以之前借鉴了一个文章&#xff0c;就是关于在windows下配置OC开发环境&#xff0c;这里我把自己的安装说一…

PaperNotes(6)-GAN/DCGAN/WGAN/WGAN-GP/WGAN-SN-网络结构/实验效果

GAN模型网络结构实验效果演化1.GAN1.1网络结构1.2实验结果2.DCGAN2.1网络结构2.2实验结果3.WGAN3.1网络结构3.2实验结果4.WGAN-GP4.1网络结构4.2实验结果5.WGAN-SN5.1网络结构5.2实验结果小结1.GAN 文章&#xff1a; https://arxiv.org/pdf/1406.2661.pdf 代码&#xff1a; Py…

Spring Security使用

Spring Security 在web应用开发中&#xff0c;安全无疑是十分重要的&#xff0c;选择Spring Security来保护web应用是一个非常好的选择。 Spring Security 是spring项目之中的一个安全模块&#xff0c;可以非常方便与spring项目无缝集成。特别是在spring boot项目中加入sprin…

leetcode115 不同的子序列

给定一个字符串 S 和一个字符串 T&#xff0c;计算在 S 的子序列中 T 出现的个数。 一个字符串的一个子序列是指&#xff0c;通过删除一些&#xff08;也可以不删除&#xff09;字符且不干扰剩余字符相对位置所组成的新字符串。&#xff08;例如&#xff0c;"ACE" 是…

leetcode104 二叉树的最大深度

给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&#xff0c; 3 / \ 9 20 / \ 15 7 返回它的最大深度…

leetcode105 前序中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树&#xff1a; 3 / \ 9 20 / \ 15 7 思路&#xff1a; 1、…