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.rhkb.cn/news/112189.html

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

相关文章

回归预测 | MATLAB实现GWO-ELM灰狼算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GWO-ELM灰狼算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GWO-ELM灰狼算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程…

scikit-learn中OneHotEncoder用法

One-Hot编码&#xff0c;又称为一位有效编码&#xff0c;是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值&#xff0c;然后&#xff0c;每个整数值被表示为二进制向量&#xff0c;将整数索引标记为1&#xff0c;其余都标为0。 OneHotEncoder()常用参数解释 …

让大数据平台数据安全可见-行云管家

数字化经济在快速发展&#xff0c;大数据时代已经到来&#xff0c;大数据已经成为企业和政府决策的重要依据。然而大数据行业快速发展所带来的一系列安全问题也继续解决&#xff0c;例如数据安全更难保障&#xff0c;例如认证体系不完善等等。为此行云管家推出了大数据平台数据…

算法:模拟思想算法

文章目录 实现原理算法思路典型例题替换所有问号提莫攻击N字型变换外观序列 总结 本篇总结的是模拟算法 实现原理 模拟算法的实现原理很简单&#xff0c;就是依据题意实现题意的目的即可&#xff0c;考察的是你能不能实现题目题意的代码能力 算法思路 没有很明显的算法思路…

数组(个人学习笔记黑马学习)

一维数组 1、定义方式 #include <iostream> using namespace std;int main() {//三种定义方式//1.int arr[5];arr[0] 10;arr[1] 20;arr[2] 30;arr[3] 40;arr[4] 50;//访问数据元素/*cout << arr[0] << endl;cout << arr[1] << endl;cout &l…

Unity 之 GameObject.Find()在场景中查找指定名称的游戏对象

文章目录 GameObject.Find 是 Unity 中的一个函数&#xff0c;用于在场景中查找指定名称的游戏对象。这个函数的主要作用是根据游戏对象的名称来查找并返回一个引用&#xff0c;使您能够在代码中操作该对象。以下是有关 GameObject.Find 的详细介绍&#xff1a; 函数签名&…

自动化运维:Ansible基础与命令行模块操作

目录 一、理论 1. Ansible 2.部署Ansible自动化运维工具 3.Ansible常用模块 4.hostsinverntory主机清单 二、实验 1.部署Ansible自动化运维工具 2.ansible 命令行模块 3.hostsinverntory主机清单 三、问题 1. ansible远程shell失败 2.组变量查看webservers内主机ip报…

【03期】说说Object类下面有几种方法呢?

今天说一道基础题型&#xff0c;不过很多人会忽略或者至少说不完整&#xff0c;但是面试时被问到的几率还是很大的。 面试题 Object有几种方法呢&#xff1f; Java语言是一种单继承结构语言&#xff0c;Java中所有的类都有一个共同的祖先。这个祖先就是Object类。 如果一个类没…

百亿数据查询秒级响应,观测体系之日志中心该如何玩转?

日志是处理生产故障、性能优化、业务分析的重要参考依据&#xff0c;是系统稳定运行不可或缺的一部分。随着业务系统规模急剧膨胀增大&#xff0c;尤其是是微服务架构逐渐普及&#xff0c;一个系统可能涉及多个应用模块与服务实例&#xff0c;传统模式下运维人员去定位问题显得…

ThinkPHP 资源路由的简单使用,restfull风格API

ThinkPHP 资源路由的简单使用&#xff0c;restfull风格API 一、资源控制器二、资源控制器简单使用 一、资源控制器 资源控制器可以轻松的创建RESTFul资源控制器&#xff0c;可以通过命令行生成需要的资源控制器&#xff0c;例如生成index应用的TestR资源控制器使用&#xff1a…

【安全】原型链污染 - Code-Breaking 2018 Thejs

目录 准备工作 环境搭建 加载项目 复现 代码审计 payload 总结 准备工作 环境搭建 Nodejs BurpSuite 加载项目 项目链接 ① 下载好了cmd切进去 ② 安装这个项目 可以检查一下 ③运行并监听 可以看到已经在3000端口启动了 复现 代码审计 const fs require(fs) cons…

Vue入门学习(一)

一、Vue环境搭建及第一个Demo 1.1编程工具&#xff1a; 下载Vscode,并安装插件 在Extensions 选项中搜索插件&#xff1a; 1&#xff1a;Live Server&#xff1a;将当前项目作为根路径&#xff0c;启动一个服务端&#xff0c;这样右键就会有如下选项 2&#xff1a;Eclipse …

golang-bufio 缓冲读

缓冲 IO 计算机中我们常听到这样的两种程序优化方式&#xff1a; 以时间换空间以空间换时间 今天要来看的缓冲IO就是典型的以空间换时间&#xff0c;它的基本原理见上图。简单的解释就是&#xff1a;程序不再直接去读取底层的数据源&#xff0c;而是通过一个缓冲区来进行读取…

java Spring Boot将不同配置拆分入不同文件管理

关于java多环境开发 最后还有一个小点 我们一般会将不同的配置 放在不同的配置文件中 好处肯定就在于 想换的时候非常方便 那么 我们直接看代码 我们将项目中的 application.yml 更改代码如下 spring:profiles:active: dev这里 意思是 我们选择了dev 环境 然后创建一个文件 …

【校招VIP】java语言考点之多线程NIO

考点介绍 多线程&NIO考点是校招面试中的常制点之一。 Java NIO是new IO的简称&#xff0c;是一种可以替代Java 10的一套新的IO机制。它提供了一套不同于Java标准1O的操作机制&#xff0c;严格来说&#xff0c;NIO与并发并无直接关系&#xff0c;但是使用NIO技术可以大大提高…

python项目实战

文章 项目1&#xff1a;外星人入侵游戏项目2&#xff1a;数据可视化2.1 matplotlib2.2 csv文件格式2.3 json文件格式2.4 使用Web API2.4.1 什么是Web API?2.4.2 处理API响应 2.5 使用Pygal可视化仓库 项目3&#xff1a;Web应用程序3.1 Django入门3.1.1 建立项目3.1.2 创建应用…

Redis怎么测试?

有些测试朋友来问我&#xff0c;redis要怎么测试&#xff1f;首先我们需要知道&#xff0c;redis是什么&#xff1f;它能做什么&#xff1f; redis是一个key-value类型的高速存储数据库。 redis常被用做&#xff1a;缓存、队列、发布订阅等。 所以&#xff0c;“redis要怎么…

视频批量剪辑矩阵分发系统源码开源分享----基于PHP语言

批量剪辑视频矩阵分发&#xff1a; 短视频seo主要基于抖音短视频平台&#xff0c;为企业实现多账号管理&#xff0c;视频分发&#xff0c;视频批量剪辑&#xff0c;抖音小程序搭建&#xff0c;企业私域转化等&#xff0c;本文主要介绍短视频矩阵系统抖音小程序开发详细及注意事…

linux创建进程

linux创建进程 准备工作 准备工作 在Ubuntu64系统上 1、安装GCC和Make工具 编译器GCC&#xff1a;把C源码转为二进制程序 Make&#xff1a;自动编译多源文件项目 sudo apt-get update #更新存储库 sudo apt-get install build-essential #安装build-essential包 gcc --versio…

023 - STM32学习笔记 - 扩展外部SDRAM(二) - 扩展外部SDRAM实验

023- STM32学习笔记 - 扩展外部SDRAM&#xff08;一&#xff09; - 扩展外部SDRAM实验 本节内容中要配置的引脚很多&#xff0c;如果你用的开发板跟我的不一样&#xff0c;请详细参照STM32规格书中说明对相关GPIO引脚进行配置。 先提前对本届内容的变成步骤进行总结如下&…