Scikit-learn降维与度量学习代码批注及相关练习

一、代码批注

代码来自:https://scikit-learn.org/stable/auto_examples/decomposition/plot_pca_iris.html#sphx-glr-auto-examples-decomposition-plot-pca-iris-py

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import decomposition
from sklearn import datasetsnp.random.seed(5)iris = datasets.load_iris()
X = iris.data
y = iris.targetfig = plt.figure(1, figsize=(4, 3))
plt.clf()
# rect:left, bottom, width, height轴位置;elev:视角仰角;azim:方位视角
ax = Axes3D(fig, rect=[0, 0, 0.95, 1], elev=48, azim=134)plt.cla()
print(X)
# PCA降维
kernels = ['linear', 'poly', 'rbf', 'sigmoid']
pca1 = decomposition.KernelPCA(n_components=3, kernel='sigmoid')
pca2 = decomposition.PCA(n_components=3)
X = pca1.fit_transform(X)
print(X)
X = pca2.fit_transform(X)
print(X)
# pca2.fit(X)
# X = pca2.transform(X)for name, label in [("Setosa", 0), ("Versicolour", 1), ("Virginica", 2)]:ax.text3D(# 调整"Setosa"、"Versicolour"这几个字的位置X[y == label, 0].mean(),X[y == label, 1].mean() + 1.5,X[y == label, 2].mean(),name,horizontalalignment="center",bbox=dict(alpha=0.5, edgecolor="w", facecolor="w"),)
# 重新排列label
y = np.choose(y, [1, 2, 0]).astype(float)
# 画点
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap=plt.cm.nipy_spectral, edgecolor="k")
# 设置坐标
ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])plt.show()
from math import log, sqrt
import numbersimport numpy as np
from scipy import linalg
from scipy.special import gammaln
from scipy.sparse import issparse
from scipy.sparse.linalg import svdsdef __init__(self,# 指定希望PCA降维后的特征维度数目n_components=None,*,# 表示是否在运行算法时,将原始训练数据复制一份copy=True,# 判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1。对于PCA降维本身来说,一般不需要白化。如果你PCA降维后有后续的数据处理动作,可以考虑白化。whiten=False,# 指定奇异值分解SVD的方法,由于特征分解是奇异值分解SVD的一个特例,一般的PCA库都是基于SVD实现的。# 有4个可以选择的值:{‘auto’, ‘full’, ‘arpack’, ‘randomized’}。# randomized一般适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法。# full则是传统意义上的SVD,使用了scipy库对应的实现。# arpack直接使用了scipy库的sparse SVD实现。# 默认是auto,即PCA类会自己去在前面讲到的三种算法里面去权衡,选择一个合适的SVD算法来降维。svd_solver="auto",# 计算的奇异值的公差tol=0.0,# '随机化'计算出的幂方法的迭代次数iterated_power="auto",# 随机种子random_state=None,
):self.n_components = n_componentsself.copy = copyself.whiten = whitenself.svd_solver = svd_solverself.tol = tolself.iterated_power = iterated_powerself.random_state = random_statedef fit(self, X, y=None):"""Fit the model with X.Parameters----------X : array-like of shape (n_samples, n_features)Training data, where `n_samples` is the number of samplesand `n_features` is the number of features.y : IgnoredIgnored.Returns-------self : objectReturns the instance itself."""self._fit(X)return selfdef fit_transform(self, X, y=None):U, S, Vt = self._fit(X)U = U[:, : self.n_components_]if self.whiten:# X_new = X * V / S * sqrt(n_samples) = U * sqrt(n_samples)U *= sqrt(X.shape[0] - 1)else:# X_new = X * V = U * S * Vt * V = U * SU *= S[: self.n_components_]return Udef _fit_full(self, X, n_components):"""Fit the model by computing full SVD on X."""# 数据中心化:将每一个数减去总体的平均数self.mean_ = np.mean(X, axis=0)X -= self.mean_# SVD分解U, S, Vt = linalg.svd(X, full_matrices=False)# flip eigenvectors' sign to enforce deterministic outputU, Vt = svd_flip(U, Vt)components_ = Vt# 用奇异值解释方差explained_variance_ = (S ** 2) / (n_samples - 1)# 方差和total_var = explained_variance_.sum()# 各个方差的比例explained_variance_ratio_ = explained_variance_ / total_var# 存储奇异值singular_values_ = S.copy()  # Store the singular values.# Postprocess the number of components requiredif n_components == "mle":n_components = _infer_dimension(explained_variance_, n_samples)elif 0 < n_components < 1.0:ratio_cumsum = stable_cumsum(explained_variance_ratio_)n_components = np.searchsorted(ratio_cumsum, n_components, side="right") + 1# 降维后维度,要小于原本的属性维度和样本维度if n_components < min(n_features, n_samples):self.noise_variance_ = explained_variance_[n_components:].mean()else:self.noise_variance_ = 0.0# 样本和属性数self.n_samples_, self.n_features_ = n_samples, n_features# 特征向量self.components_ = components_[:n_components]# 特征数self.n_components_ = n_components# 特征分解中对应的特征值self.explained_variance_ = explained_variance_[:n_components]# 特征值在所有特征值之和中所占比例self.explained_variance_ratio_ = explained_variance_ratio_[:n_components]# 定的前n个大特征值self.singular_values_ = singular_values_[:n_components]return U, S, Vt

二、源码分析

分析sklearn.decomposition.PCA函数:
在这里插入图片描述
1)copy:表示是否在运行算法时,将原始训练数据复制一份。在源码中是通过调用_validate_data,作为它的**check_params参数,最终通过check_array来判断到底复不复制训练集。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2)whiten:判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1。对于PCA降维本身来说,一般不需要白化。如果PCA降维后有后续的数据处理动作,可以考虑白化。
在这里插入图片描述
3)svd_solver:指定奇异值分解SVD的方法,由于特征分解是奇异值分解SVD的一个特例,一般的PCA库都是基于SVD实现的。有4个可以选择的值,“auto”、 “full”、“arpack”、“randomized”。randomized一般适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法。full则是传统意义上的SVD,使用了scipy库对应的实现。arpack直接使用了scipy库的sparse SVD实现。默认是auto,即PCA类会自己去在三种算法里面去权衡,选择一个合适的SVD算法来降维。
在这里插入图片描述
4)tol:计算的奇异值的公差。
5)iterated_power:'随机化’计算出的幂方法的迭代次数。
在这里插入图片描述
6)n_components:指定希望PCA降维后的特征维度数目。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、PCA与KPCA

主成分分析(PCA)适用于数据的线性降维。而核主成分分析(Kernel PCA)可实现数据的非线性降维,用于处理线性不可分的数据集。
PCA:通过投影矩阵(特征向量)将高维信息转到另外一个坐标系下,在经过SVD分解后,在某一维度上,数据分步更分散,越能代表主要特征,对数据分布情况的解释就更强,所以通过方差最大来衡量样本的分布情况,进而进行有效的低维判断。
KPCA:主要处理非线性可分的数据,它将这些数据通过非线性映射将数据映射到高维空间中,然后在高维空间里进行PCA处理,映射到另一个低维空间。
PCA是降维,把m维的数据降至k维。KPCA恰恰相反,它是把m维的数据升至k维。但是他们共同的目标都是让数据在目标维度中(线性)可分,即PCA的最大可分性。
在Kernel PCA,它有一个重要参数kernels,和函数。它有四个选项,linear:线性核函数,是在数据线性可分的情况下使用的,运算速度快,效果好,不足在于它不能处理线性不可分的数据,在下图中它的结果图和PCA一摸一样。poly:多项式核函数,多项式核函数可以将数据从低维空间映射到高维空间,但参数比较多,计算量大。rbf:高斯核函数(默认),高斯核函数同样可以将样本映射到高维空间,但相比于多项式核函数来说所需的参数比较少,通常性能不错,所以是默认使用的核函数,在下图中也是表现不错的函数。sigmoid:经常用在神经网络的映射中。因此当选用sigmoid核函数时,SVM实现的是多层神经网络。
在这里插入图片描述

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

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

相关文章

idea连接linux远程docker详细教程操作

1&#xff1a;修改docker配置文件docker.service vi /usr/lib/systemd/system/docker.service2&#xff1a;找到 ExecStart&#xff0c;在最后面添加 -H tcp://0.0.0.0:2375 # for containers run by docker ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/…

F5负载均衡器参与的Kubernetes架构选项介绍

F5负载均衡器在业内有着很高的知名度&#xff0c;因为它不仅是F5的代表作&#xff0c;负载均衡&#xff08;Load Balance&#xff09;这一词汇正是由F5发明并引入国内的。当前&#xff0c;F5的能力不断拓展&#xff0c;从早期聚焦F5负载均衡器到现在的分布式云应用架构&#xf…

Ae 效果:CC Jaws

过渡/CC Jaws Transition/CC Jaws CC Jaws&#xff08;CC 锯齿&#xff09;效果为视频或图像创造独特的锯齿状过渡效果。它允许用户控制中心点、方向、高度、宽度和形状&#xff0c;从而提供多种独特的过渡样式。 ◆ ◆ ◆ 效果属性说明 Completion 完成度 控制过渡效果的完成…

从0到1学会Git(第一部分):Git的下载和初始化配置

1.Git是什么: 首先我们看一下百度百科的介绍:Git&#xff08;读音为/gɪt/&#xff09;是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 …

Azure - AzCopy学习

使用 AzCopy 将本地数据迁移到云存储空间 azcopy login 创建存储账号 ./azcopy login --tenant-id 40242385-c249-4746-95dc-4a0b64d49dc5这里的—tenant-id 在下面的地方查看&#xff1a;目录 ID&#xff1b;需要拥有Storage Blob Data Owner 的权限账号下可能会有很多目录&am…

nginx生成自定义证书

1、创建key文件夹 [rootlocalhost centos]# mkdir key 进入key文件夹 [rootlocalhost centos]# cd key/ 2、生成私钥文件 [rootlocalhost key]# openssl genrsa -des3 -out ssl.key 4096 输入这个key文件的密码。不推荐输入&#xff0c;因为以后要给nginx使用。每次reload ngin…

帆软报表系统SSRF

有子曰&#xff1a;“信近于义&#xff0c;言可复也。恭近礼&#xff0c;远耻辱也。因不失其亲&#xff0c;亦可宗也。” SSRF 构造payload&#xff0c;访问漏洞url&#xff1a; /ReportServer?opresource&resourcehttp://x.x.x漏洞证明&#xff1a; 文笔生疏&#xf…

软考A计划-系统集成项目管理工程师-法律法规-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

数学建模(四)整数规划—匈牙利算法

目录 一、0-1型整数规划问题 1.1 案例 1.2 指派问题的标准形式 2.2 非标准形式的指派问题 二、指派问题的匈牙利解法 2.1 匈牙利解法的一般步骤 2.2 匈牙利解法的实例 2.3 代码实现 一、0-1型整数规划问题 1.1 案例 投资问题&#xff1a; 有600万元投资5个项目&…

Redis7安装

1. 使用什么系统安装redis 由于企业里面做Redis开发&#xff0c;99%都是Linux版的运用和安装&#xff0c;几乎不会涉及到Windows版&#xff0c;上一步的讲解只是为了知识的完整性&#xff0c;Windows版不作为重点&#xff0c;同学可以下去自己玩&#xff0c;企业实战就认一个版…

几个nlp的小任务(抽取式问答)

几个nlp的小任务(抽取式问答) 安装库抽取式问答介绍、SQuAD数据集初始化参数加载、导入数据集查看数据集示例加载tokenizer对长文本处理的演示对答案的位置进行验证整合刚才的步骤对数据集中的数据进行预处理加载微调模型设置args 参数使用数据清洗设置训练函数,开始训练安装…

STM32开发 | 移远4G-Cat.1模组EC200N-CN开发

一、硬件说明 1、引脚分配图 文章来源地址https://www.yii666.com/blog/326636.html文章来源地址:https://www.yii666.com/blog/326636.html 2、常用引脚说明 模块输入电源 引脚名描述VBAT_BB模块基带电源&#xff08;Vnom 3.8 V&#xff09;VBAT_RF模块射频电源&#xff0…

软件测试技术分享丨使用Postman搞定各种接口token实战

现在许多项目都使用jwt来实现用户登录和数据权限&#xff0c;校验过用户的用户名和密码后&#xff0c;会向用户响应一段经过加密的token&#xff0c;在这段token中可能储存了数据权限等&#xff0c;在后期的访问中&#xff0c;需要携带这段token&#xff0c;后台解析这段token才…

设计模式之工厂方法模式

目录 工厂方法模式 简介 优缺点 结构 使用场景 实现 1.抽象产品 2.具体产品 3.抽象工厂 4.具体工厂 5.调用 总结 抽象工厂模式 简介 结构 实现 区别 工厂方法模式 简介 提供一个用于创建对象的接口(工厂接口)&#xff0c;让其实现类(工厂实现类)决定实例化哪…

Redis内存策略

文章目录 Redis内存策略过期策略DB结构惰性删除周期删除 淘汰策略 Redis内存策略 Redis是基于内存存储&#xff0c;所以其性能很强。但单节点的Redis内存不宜过大&#xff0c;否则会影响持久化或主从同步性能。 可以手动修改配置文件来设置Redis的最大内存 # 格式&#xff1…

【Unity3D赛车游戏】【五】Unity中汽车加速效果是如何优化的?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

【滑动窗口】leetcode3:无重复字符的最长子串

一.题目描述 无重复字符的最长子串 二.思路分析 题目要求我们找符合要求的最长子串&#xff0c;要求是不能包含重复字符 确定一个子串只需确定它的左右区间即可&#xff0c;于是我们可以两层循环暴力枚举所有的子串&#xff0c;找到符合要求的&#xff0c;并通过比较得到最长…

软件工程(十五) 行为型设计模式(一)

1、责任链模式 简要说明 通过多个对象处理的请求,减少请求的发送者与接收者之间的耦合。将接受对象链接起来,在链中传递请求,直到有一个对象处理这个请求。 速记关键字 传递职责 类图如下 由类图可以比较容易的看出来,其实就是自己关联自己,形成了一个链,并且自己有…

解锁Selenium的力量:不仅仅是Web测试

Selenium简介 Selenium&#xff0c;作为Web应用测试的领军者&#xff0c;已经成为了无数开发者和测试人员的首选工具。它不仅仅是一个自动化测试工具&#xff0c;更是一个强大的Web应用交互框架。 Selenium的起源与发展 Selenium的历史可以追溯到2004年&#xff0c;由Jason Hu…

CGLIB代理,jsp,EL表达式,JSTL标准标签库

1、CGLIB代理 有一个类没有实现接口&#xff0c;想要对这个类实现增强&#xff0c;就需要使用CGLIB代理 导入CGLIB的包 <dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version> </depende…