文章目录

  • 数据块划分
    • 特征分布
  • 特征提取
    • PCA
    • LDA
    • MDS
    • Isomap
    • LLE

数据块划分

对于给定的数据集Magic(19020个样本,10个属性),我们首先将其划分为RSP数据块,然后再分别对他们进行特征提取,比较它们的特征提取结果的概率分布的相似情况

不懂RSP数据块的可以看我的这篇

我们首先先将数据划分为K个HDFS数据块(K=20

HDFS: [块数: 20 块内元素个数: 950 数据块维度: 11]

import os
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')# 导入数据
data=np.loadtxt('../Magic.txt')
data=data[:19000,:]# 修整一下数据
X=data[:,:-1]
y=data[:,-1]
print('y: ',set(y))
'''
先按HDFS数据块划分,再划分为RSP数据块
'''
K=20 # HDFS数据块个数
M=25 # RSP数据块个数
# 按顺序切分为k份
HDFS=np.array(np.split(data,K))
for i in range(HDFS.shape[0]):np.random.shuffle(HDFS[i])
HDFS_list=[np.split(D_k,M) for D_k in HDFS]
print('HDFS: [块数: {0} 块内元素个数: {1} 数据块维度: {2}]'.format(HDFS.shape[0],HDFS.shape[1],HDFS.shape[2]))

然后,再根据HDFS数据块划分为RSP数据块

RSP: [块数: 25块内元素个数: 760 数据块维度:11]

# 划分RSP
RSP=[[D_K[m] for D_K in HDFS_list] for m in range(M)]
for idx,RSP_ in enumerate(RSP):tmp_RSP=RSP_[0]for i in range(1,len(RSP_)):tmp_RSP=np.vstack((tmp_RSP,RSP_[i]))RSP[idx]=tmp_RSP
RSP=np.array(RSP)
print('RSP: [块数: {0} 块内元素个数: {1} 数据块维度: {2}]'.format(RSP.shape[0],RSP.shape[1],RSP.shape[2]))

特征分布

我们对数据整体和RSP数据子块的10个特征进行分布可视化

整体

plt.style.use('seaborn')fig, axes = plt.subplots(ncols=2, nrows=5,figsize=[15,20])
for i, ax in zip(range(10), axes.flat):# ax.set_title('fea'+str(i))ax.set_xlabel('values')ax.set_ylabel('nums')sns.distplot(data[:,i],hist=True,kde=True, ax=ax,color='royalblue')
plt.show()


RSP

对比

通过对比整体与RSP的特征分布,我们可以发现两者的分布差异不大
至此,我们便完成了RSP数据块的划分,接下来对数据整体和RSP数据子块进行特征提取

特征提取

PCA

PCA是较为基础的线性降维方法,通过svd得到特征之间协方差矩阵的特征向量,从中选择特征值最大的前k个特征向量作为主成分

我们观察在不同的特征提取个数下,各个主成分的方差占总体的比例(即降维所保留的信息占总体信息量的比例)

'''观察不同维度的方差之和'''
from sklearn.decomposition import PCAX=data[:,:-1]
pca=PCA( )
pca.fit(X)
ratio=pca.explained_variance_ratio_ # 降维后各成分的方差占比
print("pca.components_: ",pca.components_.shape)
print("pca_var_ratio: ",pca.explained_variance_ratio_.shape)
#绘制图形
plt.plot(range(X.shape[1]),[np.sum(ratio[:i+1]) for i in range(X.shape[1])])
plt.xlabel('nums of component')
plt.ylabel('sum of var ratio')
plt.xticks(np.arange(X.shape[1]))
plt.grid(True)
plt.show()


整体

# 我选择降到4维
n_pca=4
pca=PCA(n_components=n_pca)
X_pca=pca.fit_transform(X)
# 绘图
plt.style.use('seaborn')
fig, axes = plt.subplots(ncols=2, nrows=2,figsize=[10,8])
for i, ax in zip(range(4), axes.flat):ax.set_xlabel('values')ax.set_ylabel('nums')sns.distplot(X[:,i],hist=True,kde=True, ax=ax,color='royalblue')
plt.show()

RSP

# 选择某块RSP
tmp_RSP=RSP[0,:,:-1]
tmp_RSP.shape
# 我选择降到4维
n_pca=4
pca_=PCA(n_components=n_pca)
X_pca_=pca.fit_transform(tmp_RSP)
# 绘图
plt.style.use('seaborn')
fig, axes = plt.subplots(ncols=2, nrows=2,figsize=[10,8])
for i, ax in zip(range(4), axes.flat):ax.set_xlabel('values')ax.set_ylabel('nums')sns.distplot(tmp_RSP[:,i],hist=True,kde=True, ax=ax,color='royalblue')
plt.show()

PCA特征提取方法下,整体和RSP的特征分布对比

# 绘图
plt.style.use('seaborn')
fig, axes = plt.subplots(ncols=2, nrows=2,figsize=[15,12])
for i, ax in zip(range(4), axes.flat):ax.set_xlabel('values')ax.set_ylabel('nums')sns.distplot(X[:,i],hist=True,kde=True, ax=ax,color='royalblue')sns.distplot(tmp_RSP[:,i],hist=True,kde=True, ax=ax,color='red')
plt.show()


可以发现PCA的特征提取情况不错,RSP与整体的特征分布大致相同

LDA

LDA是一种线性降维方法,属于监督学习的范畴,通过计算瑞利熵从而进行投影,降维的维数需小于数据的class数

整体

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis(n_components=1)
X=data[:,:-1]
y=data[:,-1]
lda.fit(X,y)
# 绘制特征分布图
X_lda = lda.transform(X)
# 绘图
plt.style.use('seaborn')
plt.figure(figsize=[10,6])
plt.xlabel('values')
plt.ylabel('nums')
sns.distplot(X_lda[:,0],hist=True,bins=100,kde=True,color='royalblue')
plt.show()

RSP

# 选择某块RSP
X_lda_RSP=RSP[0,:,:-1]
y_lda_RSP=RSP[0,:,-1]
X_lda_RSP.shape
lda = LinearDiscriminantAnalysis(n_components=1)
lda.fit(X_lda_RSP,y_lda_RSP)# 绘制特征分布图
X_lda_trans = lda.transform(X_lda_RSP)
# 绘图
plt.style.use('seaborn')
plt.figure(figsize=[10,6])
plt.xlabel('values')
plt.ylabel('nums')
sns.distplot(X_lda_trans[:,0],hist=True,bins=100,kde=True,color='royalblue')
plt.show()

LDA特征提取方法下,整体和RSP数据块的分布对比

从上图可以看出,LDA方法在整体和RSP上所提取到的特征分布相似性非常高,这可能是因为LDA是监督学习方法,在提取特征的时候有用到样本的class信息,所提取的特征分布较为良好,但是LDA的局限性在于,可提取的特征数小于类别数,对于本数据集,class={1,2},只有两类,所以只能提取一个特征

MDS

MDS是一种线性降维方法,其核心思想就是保持样本在原空间和低维空间的距离不变
由于MDS的计算需要申请很大的内存空间,对于整体我们很难去进行降维,所以我采取对整体进行20%抽样比的简单随机抽样,理论上抽样得到的数据的特征分布和整体是基本相同的

整体

'''由于整体的isomap降维需要非常大的内存空间,
所以此处采用整体的简单随机抽样以代替整体'''
import random
X=data[:,:-1]
sample_rate=0.2
index=random.sample(list(range(X.shape[0])),int(sample_rate*X.shape[0]))
X_sample_mds=X[index,:]
from sklearn.manifold import MDS
n_MDS=4
MDS=MDS(n_components=n_MDS, max_iter=100, n_init=1)
X_mds_trans=MDS.fit_transform(X_sample_mds)
# 绘制特征分布图
plt.style.use('seaborn')
fig, axes = plt.subplots(ncols=2, nrows=2,figsize=[16,10])
fig.suptitle('0.2 sample rate',size=20)
for i, ax in zip(range(4), axes.flat):ax.set_xlabel('values')ax.set_ylabel('nums')sns.distplot(X_mds_trans[:,i],hist=True,kde=True, ax=ax,color='royalblue')
plt.show()

RSP

# 选择某块RSP
tmp_RSP=RSP[0,:,:-1]n_MDS=4
from sklearn.manifold import MDS
MDS=MDS(n_components=n_MDS, max_iter=100, n_init=1)
X_mds_rsp=MDS.fit_transform(tmp_RSP)
# 绘制特征分布图
plt.style.use('seaborn')
fig, axes = plt.subplots(ncols=2, nrows=2,figsize=[16,10])
for i, ax in zip(range(4), axes.flat):ax.set_xlabel('values')ax.set_ylabel('nums')sns.distplot(X_mds_rsp[:,i],hist=True,kde=True, ax=ax,color='royalblue')
plt.show()

MDS特征提取方法下,整体与RSP的特征分布对比

# 绘制特征分布图
plt.style.use('seaborn')
fig, axes = plt.subplots(ncols=2, nrows=2,figsize=[16,10])
for i, ax in zip(range(4), axes.flat):ax.set_xlabel('values')ax.set_ylabel('nums')sns.distplot(X_mds_trans[:,i],hist=True,kde=True, ax=ax,color='royalblue')sns.distplot(X_mds_rsp[:,i],hist=True,kde=True, ax=ax,color='red')
plt.show()

其中蓝色的为整体抽样的分布,红色的为RSP的分布,从图像上看,两者的特征分布有一定的偏差,这可能是由于抽样比太小,导致整体抽样的分布不能很好的反映整体实际的分布

Isomap

与MDS相同,Isomap的计算需要相当大的内存空间,所以此处采用整体的简单随机抽样以代替整体

整体

from sklearn.manifold import Isomap
n_neighbors=5
n_components=4
Iso=Isomap(n_neighbors=n_neighbors, n_components=n_components)
'''由于整体的isomap降维需要非常大的内存空间,
所以此处采用整体的简单随机抽样以代替整体'''
import random
X=data[:,:-1]
sample_rate=0.7
index=random.sample(list(range(X.shape[0])),int(sample_rate*X.shape[0]))
X_sample_isomap=X[index,:]
from sklearn.manifold import Isomap
n_neighbors=5
n_components=4
Iso=Isomap(n_neighbors=n_neighbors, n_components=n_components)
X_iso_trans=Iso.fit_transform(X_sample_isomap)
# 绘制特征分布图
plt.style.use('seaborn')
fig, axes = plt.subplots(ncols=2, nrows=2,figsize=[16,10])
fig.suptitle('0.7 sample rate',size=20)
for i, ax in zip(range(4), axes.flat):ax.set_xlabel('values')ax.set_ylabel('nums')sns.distplot(X_iso_trans[:,i],hist=True,kde=True, ax=ax,color='royalblue')
plt.show()

RSP

# 选择某块RSP
tmp_RSP=RSP[0,:,:-1]
tmp_RSP.shape
n_neighbors = 10
n_components = 4
Iso_RSP=Isomap(n_neighbors=n_neighbors, n_components=n_components)
X_iso_RSP=Iso_RSP.fit_transform(tmp_RSP)
# 绘制特征分布图
plt.style.use('seaborn')
fig, axes = plt.subplots(ncols=2, nrows=2,figsize=[16,10])
for i, ax in zip(range(4), axes.flat):ax.set_xlabel('values')ax.set_ylabel('nums')sns.distplot(X_iso_RSP[:,i],hist=True,kde=True, ax=ax,color='royalblue')
plt.show()

Isomap特征提取方法下,整体和RSP的分布对比

# 绘制特征分布图
plt.style.use('seaborn')
fig, axes = plt.subplots(ncols=2, nrows=2,figsize=[16,10])
for i, ax in zip(range(4), axes.flat):ax.set_xlabel('values')ax.set_ylabel('nums')sns.distplot(X_iso_trans[:,i],hist=True,kde=True, ax=ax,color='royalblue')sns.distplot(X_iso_RSP[:,i],hist=True,kde=True, ax=ax,color='red')
plt.show()


其中红色为RSP数据块的特征分布,蓝色的为整体的特征分布,可以看出RSP数据块的分布较整体的分布而言要更集中,更高,但总体是较为相似的.

Isomap方法本质上属于一种特殊的MDS,不同之处在于Isomap方法用图中两点的最短路径替代了MDS中欧式空间的距离,这样能更好的拟合流形体数据

而在Isomap特征提取方法下的整体和RSP数据块的特征分布不太相似,猜测是因为Magic数据的分布不算是流形,故非线性降维的方法不如线性降维方法,例如PCA和LDA

LLE

LLE是局部线性嵌入的特征提取方式,是一种非线性降维方法

from functools import partial
from sklearn.manifold import LocallyLinearEmbedding
n_neighbors = 10
n_components = 4
# 设置流形学习的方法
LLE = partial(LocallyLinearEmbedding,n_neighbors=n_neighbors,n_components=n_components,eigen_solver="auto",
)

整体

X=data[:,:-1]
LLE_standard=LLE(method="standard")
LLE_standard.fit(X)
# 保存模型
import joblib
joblib.dump(LLE_standard, "LLE_standard_4.m")
# 绘制特征分布图
X_LLE_std=LLE_standard.transform(X)
# 绘图
plt.style.use('seaborn')
fig, axes = plt.subplots(ncols=2, nrows=2,figsize=[16,10])
for i, ax in zip(range(4), axes.flat):ax.set_xlabel('values')ax.set_ylabel('nums')ax.set_xlim([-0.05,0.05])sns.distplot(X_LLE_std[:,i],hist=True,bins=100,kde=True, ax=ax,color='royalblue')
plt.show()

RSP

# 选择某块RSP
tmp_RSP=RSP[0,:,:-1]
tmp_RSP.shape
LLE_std_=LLE(method="standard")
LLE_std_.fit(tmp_RSP)
# 保存模型
import joblib
joblib.dump(LLE_std_, "LLE_standard_RSP_4.m")
# 绘制特征分布图
X_LLE_std_RSP=LLE_standard.transform(tmp_RSP)
# 绘图
plt.style.use('seaborn')
fig, axes = plt.subplots(ncols=2, nrows=2,figsize=[16,10])
for i, ax in zip(range(4), axes.flat):ax.set_xlabel('values')ax.set_ylabel('nums')ax.set_xlim([-0.05,0.05])sns.distplot(X_LLE_std_RSP[:,i],hist=True,bins=100,kde=True, ax=ax,color='royalblue')
plt.show()


LLE特征提取方法下,整体和RSP的特征分布对比

# 绘制特征分布图
X_LLE_std_RSP=LLE_standard.transform(tmp_RSP)
# 绘图
plt.style.use('seaborn')
fig, axes = plt.subplots(ncols=2, nrows=2,figsize=[16,10])
for i, ax in zip(range(4), axes.flat):ax.set_xlabel('values')ax.set_ylabel('nums')ax.set_xlim([-0.05,0.05])sns.distplot(X_LLE_std[:,i],hist=True,bins=100,kde=True, ax=ax,color='royalblue')sns.distplot(X_LLE_std_RSP[:,i],hist=True,bins=100,kde=True, ax=ax,color='red')
plt.show()


从整体和RSP的特征分布对比来看,虽然两者之间比较相似,可是可以看出,LLE所提取到的特征分布不是特别均匀,这是由于LLE具有一定的局限性,其要求数据不能是闭合流形,不能是稀疏的数据集,不能是分布不均的数据集等等,局限性较强,不适用于本数据集

大数据(线性/非线性)降维方法(PCA,LDA,MDS,ISOMAP,LLE)相关推荐

  1. 机器学习之降维方法(LDA、PCA)小结

    1 线性判别分析(LDA) 1.1 LDA简介 LDA是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的.一句话来概括LDA的核心思想,[投影后类内方差最小,类间方差最大].我们将数 ...

  2. 千万级别数据查询优化_MySQL大数据量分页查询方法及其优化

    MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...

  3. mysql一样的查询在我本地很快但是线上很慢_MySQL大数据量分页查询方法及其优化...

    MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...

  4. 大数据可视化的应用方法

    随着互联网的不断发展,大数据技术在各个行业中都有不同的表现作用,作为助力企业经营决策的大数据可视化应用,对于的企业发展起着至关重要的作用,但是如何利用大数据可视化,如何做好大数据可视化?而今天我们就一 ...

  5. MySQL 和 Oracle 大数据量分页查询方法及其优化

    MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...

  6. 浅析大数据时代下市场研究方法

    大数据时代新的市场研究方法使"无干扰"真实还原消费过程成为可能,智能化的信息处理技术使低成本.大样本的定量调研成为现实,这将推动消费行为及消费心理研究达到一个新的高度,帮助快速消费 ...

  7. 大数据线性回归预测学生成绩

    通过训练集训练和测试集测试来生成多个线性模型,从而预测学生成绩,本文所有代码请点击Github 1. 实验数据背景 1.1 数据来源 本项目的数据来源于kaggle.com,数据集的名称为Studen ...

  8. 达观数据:文本大数据的机器学习自动分类方法

    随着互联网技术的迅速发展与普及,如何对浩如烟海的数据进行分类.组织和管理,已经成为一个具有重要用途的研究课题.而在这些数据中,文本数据又是数量最大的一类.文本分类是指在给定分类体系下,根据文本内容自动 ...

  9. 大数据时代,统计学方法有多大的效果?

    统计学理论得以发展,主要还是因为无法观测到全体,需要抽样,需要通过样本推断总体,才发展了许多方法. 61 人赞同 居然有这么多说大数据时代统计无用的观点!?楼上各位的眼中统计似乎只是门抽样学. 以前当 ...

  10. MySQL大数据量分页查询方法及其优化

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:收藏了!7 个开源的 Spring Boot 前后端分离优质项目个人原创+1博客:点击前往,查看更多 链接:ht ...

最新文章

  1. mvn打包的POm文件
  2. 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)
  3. ROS学习笔记-ROS语音识别与语音输出[1]
  4. UVA - 1388 Graveyard 【数学】
  5. 准备写一本协议方面的书,谁赞成,谁反对?
  6. asp.net处理get,post数据
  7. Memcached的几种Java客户端(待实践)
  8. You-Get—— 基于 Python3 的媒体下载工具
  9. 智能物流的常见应用场景及系统
  10. 线上靶机prompt.ml
  11. Power Query批量合并Excel文件
  12. 迅雷:大步伐向区块链转型,但商业化落地仍是个问题 |追击上市公司
  13. 美容院如何优化预约服务?
  14. 从上帝视角看进程调度
  15. C++ vector函数
  16. python如何下载安装glfw_Python之OpenGL笔记(1):窗口工具包GLFW的安装
  17. vite打包分析插件rollup-plugin-visualizer
  18. Relax与CMMI Level 4 KPA的对应关系
  19. OpenCV信用卡识别
  20. 2023年医疗器械维修培训计划

热门文章

  1. linux下socket编程处理TCP粘包
  2. 2021-09-09【linux】丨shell使用for循环遍历文件/数组
  3. C++我记得应该是当初笔试面试常考的
  4. Java下载文件时文件名出现乱码(但文件内容正常)
  5. 只用div+CSS做淘宝手机端首页
  6. java中缓存的原理
  7. 微博营销和软文营销的价值
  8. 什么事aop,aop的作用是什么?aop在项目哪里使用到了
  9. NJU-ICS-linklab 从零开始复习程序的链接与ELF
  10. 关于CList的小知识