浅谈降维实操,一种用于处理特征的方式——后附Python代码

news2024/9/20 16:37:39

👦👦一个帅气的boy,你可以叫我Love And Program
🖱 ⌨个人主页:Love And Program的个人主页
💖💖如果对你有帮助的话希望三连💨💨支持一下博主

降维实操

  • 前言
  • 线性降维
    • 低维嵌入
    • 多维缩放(MDS)
      • 简介
      • MDS示例代码
    • 主成分分析法
      • 简介
    • 核化线性降维
      • 简介
    • PCA和KPCA手写数字体识别实例代码
  • 流形学习
    • 简介
    • 等度量映射(Isomap)
      • 简介
      • Isomap示例代码
    • 局部线性嵌入(LLE)
      • 简介
      • LLE示例代码

前言

最近看书看到降维一部分,说实话这一部分一直想写,但是苦于网上讲解的初级理论部分过于全面,自己也是无从可写,但看完周志华的机器学习一书中写的降维部分,感觉还是有新的理解的,权当记录一下,文中有什么不对的地方还望大佬们多担待,评论我我会及时更改。


线性降维

       降维是将数据通过某种数学变换将原始高维属性空间转变为一个低维“子空间”,在此子空间中样本密度大幅提高,距离计算也变得更为容易,通俗点讲就是关系更加密切,训练模型鲁棒性更好。

低维嵌入

       这样就引出了我们为什么要将数据降维的原因,实际任务中人们收集或观测的数据样本是高维的,但是与学习任务密切相关的也许仅仅是某个低维分布,即高维空间中的一个低维“嵌入”,在这个低维嵌入子空间中更容易让模型学习。

多维缩放(MDS)

简介

       在原始空间中样本之间的距离在低维空间中得以保持即得到“多维缩放”(MDS),其采用欧氏距离计算原始空间中的距离,尽可能保留高维空间中的“相似度”信息。

算法描述

式(10.7)

式(10.8)

式(10.9)

式(10.10)

推导可见

MDS示例代码

from collections import OrderedDict
from functools import partial
from time import time

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.ticker import NullFormatter
from sklearn import manifold, datasets
Axes3D

n_points = 1000
X, color = datasets.make_s_curve(n_points, random_state=0)
fig = plt.figure()

ax = fig.add_subplot(121, projection='3d')
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=color, cmap=plt.cm.Spectral)
ax.view_init(4, -72)
methods = OrderedDict()
methods['MDS'] = manifold.MDS(n_components, max_iter=100, n_init=1)
for i, (label, method) in enumerate(methods.items()):
    t0 = time()
    Y = method.fit_transform(X)
    t1 = time()
    print("%s: %.2g sec" % (label, t1 - t0))
    ax = fig.add_subplot(1, 2, 2)
    ax.scatter(Y[:, 0], Y[:, 1], c=color, cmap=plt.cm.Spectral)
    ax.set_title("%s (%.2g sec)" % (label, t1 - t0))
    ax.xaxis.set_major_formatter(NullFormatter())
    ax.yaxis.set_major_formatter(NullFormatter())
    ax.axis('tight')
plt.show()

主成分分析法

简介

       主成分分析(Principal Component Analysis,PCA), 是一种统计方法,通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分(来源于百度百科)。
       主成分分析法适用于变量间有较强相关性的数据,毕竟数据间关系弱的,经过PCA降维后会舍弃部分信息,关系可能会更弱,那用降维的意义也就不存在了,其具体作用有两方面:

  1. 舍弃此部分信息后能使样本的采样密度增大,正如上面所说:高维数据到低维数据转换后数据间的密度会大大提高;
  2. 当数据受到噪声影响时,最小的特征值所对应的特征向量往往与噪声有关,将它们舍弃可以在一定程度上起到去噪的效果;

算法描述

核化线性降维

简介

       核化线性降维是非线性降维,是基于核技巧对线性降维方法进行“核化”,例如核主成分分析(KPCA),优点就是,保留了最主要的特征,计算方法简单,但缺点也很明显,使用非线性核可以实现非线性降维计算开销极大,直接给我报Memory Error,以下代码请酌情更改输入数据集比例。

PCA和KPCA手写数字体识别实例代码

from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn.decomposition import KernelPCA
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784', cache=True)
print(mnist.data.shape)
import matplotlib.pyplot as plt
def display_sample(num):

    image = mnist.data.iloc[num,:].to_numpy().reshape([28,28])
    plt.imshow(image, cmap=plt.get_cmap('gray_r'))
    plt.show()
display_sample(10)

train_img, test_img, train_lbl, test_lbl = train_test_split(
    mnist.data, mnist.target, test_size=0.8, random_state=0)
print(train_img.shape)
print(test_img.shape)

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(train_img)
train_img = scaler.transform(train_img)
test_img = scaler.transform(test_img)

from sklearn.linear_model import LogisticRegression
logisticRegr = LogisticRegression(solver = 'lbfgs',max_iter=1000)
logisticRegr.fit(train_img, train_lbl)
score = logisticRegr.score(test_img, test_lbl)
print(score)
# KPCA
# scikit_kpca = KernelPCA(n_components=2, kernel='rbf', gamma=15)
# X_skernpca = scikit_kpca.fit_transform(train_img)
# plt.scatter(X_skernpca[test_img, 0], X_skernpca[test_img, 1], color='red', marker='^', alpha=0.5)
# plt.scatter(X_skernpca[test_lbl, 0], X_skernpca[test_lbl==1, 1], color='blue', marker='o', alpha=0.5)
# plt.xlabel('PC1')
# plt.ylabel('PC2')
# plt.tight_layout()
# plt.show()

# PCA
from sklearn.decomposition import PCA
pca = PCA(0.95)
pca.fit(train_img)
print(pca.n_components_)
train2_img = pca.transform(train_img)
test2_img = pca.transform(test_img)
print(train2_img.shape)
print(train_img.shape)

logisticRegr = LogisticRegression(solver = 'lbfgs',max_iter=1000)
logisticRegr.fit(train2_img, train_lbl)
score = logisticRegr.score(test2_img, test_lbl)
print(score)
#minist数据集及划分比例
#(70000, 784)
#(14000, 784)
#(56000, 784)
#降维前预测准确率
#0.8843214285714286
#保留特征数量
#293
#降维后数据量对比
#(14000, 293)
#(14000, 784)
#降维后预测准确率
#0.9033214285714286

流形学习

简介

       流形学习是一类借鉴拓扑流形概念的降维方法,“流形”是在局部与欧氏空间同胚的空间,也就是说他在局部具有欧氏空间的性质,能用欧氏距离来进行距离计算,用到降维中,即低维流形嵌入到高维空间中,局部仍然具有欧氏空间的性质,因此很容易在局部建立降维映射关系,然后在设法将局部映射关系推广到全局,以两种著名的流形学习方法为例,即非线性降维。

等度量映射(Isomap)

Isomap算法是最早的流形学习方法之一,它是等距映射的缩写。Isomap可以看作是多维尺度分析(MDS)或核主成分分析的扩展。

简介

       Isomap寻求一种更低维度的嵌入,以保持所有点之间的测地线距离,毕竟如下左图最上面一层到中间一层在三维坐标中不能直接计算直线距离,这样是不恰当的,需要沿着两层之间的边边连线形成距离最短的路径,也就是测地线距离,虽然低维嵌入流形上的测地线距离不能用高维空间的直线距离计算,但是可以通过近邻距离来求近似(图画的不是很好,右图线都是直的嗷,蓝线:近邻距离,也就是左图三维直线距离被二维可视化;红线:测地线距离)
在这里插入图片描述

算法描述

Isomap示例代码

from collections import OrderedDict
from functools import partial
from time import time
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.ticker import NullFormatter
from sklearn import manifold, datasets
# Next line to silence pyflakes. This import is needed.
Axes3D
n_points = 1000
X, color = datasets.make_s_curve(n_points, random_state=0)
fig = plt.figure()
ax = fig.add_subplot(121, projection='3d')
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=color, cmap=plt.cm.Spectral)
ax.view_init(4, -72)
methods = OrderedDict()
methods['Isomap'] = manifold.Isomap(n_components=2)
for i, (label, method) in enumerate(methods.items()):
    t0 = time()
    Y = method.fit_transform(X)
    t1 = time()
    print("%s: %.2g sec" % (label, t1 - t0))
    ax = fig.add_subplot(1, 2, 2)
    ax.scatter(Y[:, 0], Y[:, 1], c=color, cmap=plt.cm.Spectral)
    ax.set_title("%s (%.2g sec)" % (label, t1 - t0))
    ax.xaxis.set_major_formatter(NullFormatter())
    ax.yaxis.set_major_formatter(NullFormatter())
    ax.axis('tight')

plt.show()

       以S型曲线数据集为例,将三维数据映射到二维平面上,如下图所示:
在这里插入图片描述

局部线性嵌入(LLE)

简介

       局部线性嵌入试图保持邻域内样本线性关系,意思就是经历过降维后仍然在原空间具有该特征。并且LLE可以在sklearn机器学习库中直接调用。

算法描述:

式(10.27)
式(10.30)

推导过程(感兴趣可以去看看)

LLE示例代码

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
Axes3D
from sklearn import manifold, datasets
X, color = datasets.make_swiss_roll(n_samples=1500)
print("Computing LLE embedding")
X_r, err = manifold.locally_linear_embedding(X, n_neighbors=12,
                                             n_components=2)
print("Done. Reconstruction error: %g" % err)
fig = plt.figure()

ax = fig.add_subplot(211, projection='3d')
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=color, cmap=plt.cm.Spectral)

ax.set_title("Original data")
ax = fig.add_subplot(212)
ax.scatter(X_r[:, 0], X_r[:, 1], c=color, cmap=plt.cm.Spectral)
plt.axis('tight')
plt.xticks([]), plt.yticks([])
plt.title('Projected data')
plt.show()

以swiss(称他为瑞士卷)为例,将三维数据进行二维化:
在这里插入图片描述

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

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

相关文章

list的模拟实现(万字解读+由浅入深)

先申明一下本篇总体介绍过程是按照逐步深入去写的,所以可能有些同样类型不在一块! 前言: 写这篇博客的时候,我是边思考边写它!自己其中感觉自己对于list的理解更加的深入,其中提出的很多问题让我明白了lis…

Android Studio 实现桌面小组件(APPWidget)

前言 微件是定制主屏幕的一个重要方面。它允许您从用户的主屏幕直接看到最重要的应用程序数据和功能。用户可以在主屏幕面板之间移动微件、调整其大小,并根据自己的喜好自定义微件中的信息量。微贱类型主要分为:信息微件(显示对用户来说很重…

Service详解

Service详解 文章目录Service详解Service介绍kube-proxy目前支持三种工作模式:userspace 模式iptables 模式ipvs 模式Service类型Service使用实验环境准备ClusterIP类型的ServiceEndpoint负载分发策略HeadLiness类型的ServiceNodePort类型的ServiceLoadBalancer类型的ServiceEx…

嵌入式Linux 开发经验:编写用户态应用程序 ioctl 控制 misc 设备

参考文章 VSCode SSH 连接远程ubuntu Linux 主机 ubuntu 20.04 qemu linux6.0.1 开发环境搭建 ubuntu 20.04 qemu linux6.0.1 制作ext4根文件系统 嵌入式Linux 开发经验:platform_driver_register 的使用方法 嵌入式Linux 开发经验:注册一个 misc 设…

阿里巴巴专场——第322场周赛题解

目录 模拟法:6253.回环句 排序后模拟:6254. 划分技能点相等的团队 BFS:6255. 两个城市间路径的最小分数 BFS:6256. 将节点分成尽可能多的组 模拟法:6253.回环句 这道题直接按照题目的意思暴力模拟即可:…

Ubuntu20.04 安装配置 Ros2

记录一下折磨了一周的ros2配置qaq以及踩的无数坑 第一次按照一个教程安装后,命令行输入sudo apt-update 报错 The repository http://packages.ros.org/ros/ubuntu $(lsb_release-sc) Release does not have a Release file. 卸载后,按照第二个教程安装…

(十) 共享模型之内存【有序性】

JVM 会在不影响正确性的前提下,可以调整语句的执行顺序这种特性称之为『指令重排』,多线程下『指令重排』会影响正确性。为什么要有重排指令这项优化呢?从 CPU 执行指令的原理来理解一下吧 一、原理之指令级并行(了解)…

[附源码]Python计算机毕业设计Django企业人事管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

如何使用HTML制作个人网站( web期末大作业)

📂文章目录一、👨‍🎓网站题目二、✍️网站描述三、📚网站介绍四、🌐网站演示五、⚙️ 网站代码🧱HTML结构代码💒CSS样式代码六、🥇 如何让学习不再盲目七、🎁更多干货一…

Linux安装mysql

1、 查看是否已经安装 Mysql rpm -qa | grep mysql 如果你查看出来有东西,可以使用下面命令将其删除 rpm -e 文件名 2 、下载官方 Mysql 包 wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 如果安装有提示:Cannot…

HTML5期末大作业:北京旅游网页设计制作(1页) 简单静态HTML网页作品 我的旅游网页作业成品 学生旅游网站模板

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

gin 集成 Swagger

前言 一个好的项目工程,必然离不开一个好的 API 文档,如果要自己编写 API 文档,维护起来比较困难,而且难以保证一致性,因此我们要自动生成在线接口文档。 swaggo swagger 在 java 里面,是一个非常流行的…

后渗透之日志分析实验

目录 一、实验项目名称 二、实验目的 三、实验内容 四、实验环境 五、实验步骤 六、实验结果 七、实验总结 一、实验项目名称 后渗透之日志分析实验 二、实验目的 1.掌握meterpreter进行端口转发的方法 2.掌握网站日志的分析方法 三、实验内容 针对目标网站服务器…

AlphaFold2源码解析(7)--模型之Evoformer

AlphaFold2源码解析(7)–模型之Evoformer 这篇文章我们主要药讲解AlphaFold2的Evoformer的代码细节。 Evoformer Stack 该网络有一个双塔结构,在MSA堆栈中具有轴向的自我注意;在Pair堆栈中具有三角形的乘法更新和三角形的自我注意;以及外积…

Windows多线程编程

一、 实验内容或题目: 以多线程编程的方式完成: 1)随机生成一个数组,求其平均值 2)随机生成一个数组,求其最大值 3)随机生成一个数组,求其最小值 二、 实验目的与要求:…

Kaggle Feedback Prize 3比赛总结:如何高效使用hidden states输出(2)

比赛链接:https://www.kaggle.com/competitions/feedback-prize-english-language-learning 在Kaggle Feedback Prize 3比赛总结:如何高效使用hidden states输出(2)中介绍了针对last layer hidden state的各种pooling的方法。 在利用Transformer类的预…

Vue学习:Hello小案例

使用Vue的目的:构建用户界面(需要使用容器 摆放这个界面的内容) favicon.ico:1 GET http://127.0.0.1:5500/favicon.ico 404 (Not Found) 没有页签图标 在者服务器中 http://127.0.0.1:5500没有/favicon.ico 强制刷新网页:s…

3大经典分布式存储算法

文章目录1、背景2、算法2.1 分布存储之哈希取余算法2.2 分布式存储之一致性哈希算法2.3 分布式存储之哈希槽算法1、背景 一个经典的面试题目:1~2亿条数据需要缓存,请问如何设计这个方案? 回答:单台单机肯定不可能&…

Musical Christmas Lights——一个圣诞树灯光✨随音乐节奏改变的前端开源项目

文章目录前言视频介绍项目截图项目地址项目源码以上就是本篇文章的全部内容,将你编写好的项目分享给你的朋友们或者那个TA吧!制作不易,求个三连!❤️ 💬 ⭐️前言 今天博主在刷短视频时😐,朋友推…

VMware 虚拟机系统 与 win10 共享文件夹问题的解决

环境描述 本地:Win10 64位 VMware Workstation Pro 16 虚拟机,安装的 ubuntu 20.04 文件夹共享 win10 与 虚拟机的 ubuntu 共享文件夹,之前低版本的 VMware ,安装 VMware Tools,并且 win10 端设置好工作目录后&…