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

news2025/1/12 20:00:56

一、代码批注

代码来自: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 datasets

np.random.seed(5)

iris = datasets.load_iris()
X = iris.data
y = iris.target

fig = 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 numbers

import numpy as np
from scipy import linalg
from scipy.special import gammaln
from scipy.sparse import issparse
from scipy.sparse.linalg import svds

def __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_components
    self.copy = copy
    self.whiten = whiten
    self.svd_solver = svd_solver
    self.tol = tol
    self.iterated_power = iterated_power
    self.random_state = random_state


def 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 samples
        and `n_features` is the number of features.

    y : Ignored
        Ignored.

    Returns
    -------
    self : object
        Returns the instance itself.
    """
    self._fit(X)
    return self


def 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 * S
        U *= S[: self.n_components_]
    return U





def _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 output
    U, 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 required
    if 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.coloradmin.cn/o/917432.html

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

相关文章

Ruoyi安装部署(linux环境、前后端不分离版本)

目录 简介 1 新建目录 2 安装jdk 2.1 jdk下载 2.2 解压并移动文件夹到/data/service目录 2.3 配置环境变量 3 安装maven 3.1 进入官网下载最新的maven 3.2 解压并移动文件夹到/data//service目录 3.3 配置环境变量 3.4 配置本地仓库地址与阿里云镜像 4 安装git 4.…

Linux centos7 高频词统计

如何统计文章中高频词?是我们经常遇到的问题&#xff0c;也是多场合考察个人知识整合能力的重要手段。招聘经典问题&#xff1a;linux中命令行统计文件中前10个高频词。 在讨论此问题中&#xff0c;主要应用到的知识点有&#xff1a;排序、去重、单词查询、grep、sed和awk使用…

AWS解决方案日:Web 3业务安全方案

近日&#xff0c;AWS合作伙伴之Web3解决方案日在香港举办&#xff0c;多家科技公司专家和企业代表就WEB 3.0方案、AI创新和Web 3.0安全进行了探讨。顶象现场展示了Web 3.0业务安全解决方案。 NFT是Web 3.0典型场景之一。NFT基于区块链技术的非同质化代币&#xff0c;具有不可分…

行为型(七) - 访问者模式

一、概念 访问者模式&#xff08;Visitor Pattern&#xff09;&#xff1a;我们使用了一个访问者类&#xff0c;改变元素类的执行算法。通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变。 优点&#xff1a;把业务操作跟具体的数据结构解耦。 二、实现 我们…

利用ANARCI标识CDR区域

brief 总有一些朋友丢给我一些抗体蛋白序列,希望我把抗体的框架区和高变区标识出来。 然后ANARCI 可以对抗蛋白序列的氨基酸进行编号和allign。 所以我想ANARCI可以解决这个问题。 安装 github开源软件: https://github.com/oxpig/ANARCI 也有网页版的: https://opig.st…

Quickstart: MinIO for Linux

单节点部署教程 1.安装Minio服务端 //wget下载二进制文件 wget https://dl.min.io/server/minio/release/linux-amd64/minio //赋予权限 chmod x minio //将minio可执行文件移入usr/local/bin目录下&#xff0c;使得minio可以全局执行 sudo mv minio /usr/local/bin/ 2.启动Mi…

React基础入门之虚拟Dom

React官方文档&#xff1a;https://react.docschina.org/ 说明 重要提示&#xff1a;本系列文章基础篇总结自尚硅谷课程&#xff0c;且采用类式写法&#xff01;&#xff01;最新的函数式组件写法见高级篇。 本系列文档旨在帮助vue同学更快速的学习react&#xff0c;如果你很…

OpenAI推出GPT-3.5Turbo微调功能并更新API;Midjourney更新局部绘制功能

&#x1f989; AI新闻 &#x1f680; OpenAI推出GPT-3.5Turbo微调功能并更新API&#xff0c;将提供GPT-4微调功能 摘要&#xff1a;OpenAI宣布推出GPT-3.5Turbo微调功能&#xff0c;并更新API&#xff0c;使企业和开发者能够定制ChatGPT&#xff0c;达到或超过GPT-4的能力。通…

如何使用装rancher安装k8s集群(k8s集群图形化管理工具)

前言 kubernetes集群的图形化管理工具主要有以下几种&#xff1a; 1、 Kubernetes Dashborad: Kubernetes 官方提供的图形化工具 2、 Rancher: 目前比较主流的企业级kubernetes可视化管理工具 3、各个云厂商Kubernetes集成的管理器 4、 Kuboard: 国产开源Kubernetes可视化管理…

异地容灾备份方式有哪些?异地容灾备份是什么意思

在当今的数字时代&#xff0c;数据已经成为公司的主要资产。然而&#xff0c;数据的丢失或损坏可能会给公司带来巨大的损失。因此&#xff0c;异地容灾备份已成为企业应考虑的因素。本文将详细介绍异地容灾备份的形式&#xff0c;以帮助企业更好地维护其重要数据。 什么是异地…

自定义QGraphcsItem旋转移动缩放组合

简单的记录下学习自定义QGraphicsItem 移动、旋转、缩放、组合。 1. QGraphicsView缩放 通过鼠标滚轮缩放整个视图 重写GraphicsView的wheelEvent(QWheelEvent *event)事件 // //QttGraphicsView::QttGraphicsView(QGraphicsScene* scene, QWidget* parent) : QGraphicsView(s…

经营决策垂直大模型——WinPlan经营大脑9月正式上线

经营决策产品提供商「数利得科技」(以下简称“数利得”)日前获近千万天使轮融资,由耀途资本独家投资。本轮融资资金将用于产品研发和算法模型搭建。 数利得成立于2022年,核心成员出身于阿里旗下钉钉,曾负责财税、业财一体、生态开放等业务,商业化经验丰富。在与众多企业…

如何快速查询京东快递并查询超时状态?

随着电子商务的蓬勃发展&#xff0c;快递成为了我们日常生活中不可或缺的一部分。而在众多快递公司中&#xff0c;京东快递以其高效、可靠的服务赢得了广大用户的青睐。然而&#xff0c;查询京东快递并同时查询快递的超时状态却一直是用户们头痛的问题。今天&#xff0c;我将为…

什么是Nginx HA?

什么是Nginx HA 1.1 什么是Nginx HA?1.2 高可用性的类型1.3 理解Nginx HA 示例1.4为什么高可用性很重要&#xff1f;1.5 高可用是如何实现的&#xff1f;1.6 如何支持高可用性?1.7 最佳实践&#xff1a;高可用性 1.1 什么是Nginx HA? 高可用性(HA) 是指系统通常通过使用内置…

水体测试积分球

水质分析包括观察分析、嗅味分析、仪器分析和化验分析等方法。排除分析过程中的影响因素&#xff0c;确保得到数据的准确性&#xff0c;保证分析质量&#xff0c;让人们深入了解水情况&#xff0c;合理利用水资源。在水质分析化验中&#xff0c;要对样品进行严格的控制&#xf…

DNDC模型---土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的应用

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会议上讲到&#xff0c;要把“双碳”纳入经济社会发展和生态文明建设整体布局。同时&#xff0c;提到要把减污降碳协同增效作为促…

新能源电动汽车有序充电,多场景充电解决方案-安科瑞黄安南

随着我国能源战略发展以及低碳行动的实施&#xff0c;电动汽车已逐步广泛应用&#xff0c;而电动汽车的应用非常符合当今社会对环保意识的要求&#xff0c;以及有效节省化石燃料的消耗。 由于其没有污染排放的优点以及政府部门的关注&#xff0c;电动汽车将成为以后出行的重要…

centos8安装mysql

1.首先用finalShell远程连接到服务器 2.如果服务器之前安装过mysql请先卸载,我这里是用yum安装的&#xff0c;现在通过yum去卸载 yum remove -y mysql find / -name mysql //找到残留的文件&#xff0c;再通过rm -rf去删除对应的文件3.下面正式开始安装 &#xff08;1&#…

【unity小技巧】Unity实现视差效果与无限地图(附git源码)

文章目录 前言下载素材1. 角色素材 环境搭建和人物移动视差效果无限背景源码参考完结 前言 如何提升你的画面感&#xff1f;动态的背景设计可以丰富我们的游戏效果&#xff0c;当你在游戏中行走或奔跑时&#xff0c;你将能够感受到身体在空间中的运动&#xff0c;仿佛真的置身…

成集云 | 抖店连接器客户静默下单催付数据同步钉钉 | 解决方案

源系统成集云目标系统 方案介绍 随着各品牌全渠道铺货&#xff0c;主播在平台上直播时客户下了订单后不能及时付款&#xff0c;第一时间客户收不到提醒&#xff0c;不仅造成了客户付款率下降&#xff0c;更大量消耗了企业的人力成本和经济。而成集云与钉钉深度合作&#xff0…