Python 之 降低数据的维度,实现可视化

 

1.导入相关模块

import numpy as np
from sklearn.datasets import fetch_openml

2.MNIST Dataset

mnist = fetch_openml("mnist_784")
X = mnist.data / 255.0
y = mnist.target
X.shape, y.shape

数据转换为Pandas数据框架

import pandas as pd

feat_cols = ['pixel' + str(i) for i in range(X.shape[1])]

df = pd.DataFrame(X, columns=feat_cols)
df['label'] = y
df['label'] = df['label'].apply(lambda i: str(i))

X, y = None, None

print('Size of the dataframe: {}'.format(df.shape))

由于数据框中的教程是按类排序的,所以我们需要一个随机顺序的索引向量来混合例子。

rndperm = np.random.permutation(df.shape[0])

将随机图像可视化

matshow允许将一个二维矩阵或数组可视化为一个彩色图像。

%matplotlib inline
import matplotlib.pyplot as plt

# Plot the graph
plt.gray()
fig = plt.figure( figsize=(16, 7) )
for i in range(0, 15):
    ax = fig.add_subplot(3, 5, i+1) 
    ax.matshow(df.loc[rndperm[i],feat_cols].values.reshape((28,28)).astype(float))
plt.show();

3.PCA

PCA是一种在保留参考数据基本信息的前提下,减少样本测量次数的方法。我们将着重介绍图像的3个主要组成部分

from sklearn.decomposition import PCA

pca = PCA(n_components=3)
pca_result = pca.fit_transform(df[feat_cols].values)

df['PC1'] = pca_result[:, 0]
df['PC2'] = pca_result[:, 1] 
df['PC3'] = pca_result[:, 2]

print('Explained variation per principal component: {}'.format(pca.explained_variance_ratio_))

前三个部分描述了原始数据分布的23%。

from ggplot import *

chart = ggplot( df.loc[rndperm[:3000],:], aes(x='PC1', y='PC2', color='label') ) \
        + geom_point(size=50, alpha=0.8) \
        + ggtitle("First and Second Principal Components colored by digit")
chart

<ggplot: (9387058)>

4.T-分布式随机邻域实体(t-SNE)。

T-SNE是基于减少两个分布的差异:输入对象的成对相似度(距离)分布和对应对象(点)在小维空间的成对相似度分布。

该方法是资源密集型的,所以建议使用PCA(对于稀疏数据--TruncatedSVD)来处理大量的属性。

import time

from sklearn.manifold import TSNE

n_sne = 7000

time_start = time.time()
tsne = TSNE(n_components=2, verbose=1, perplexity=40, n_iter=300)
tsne_results = tsne.fit_transform(df.loc[rndperm[:n_sne],feat_cols].values)

print('t-SNE done! Time elapsed: {} seconds'.format(time.time()-time_start))

df_tsne = df.loc[rndperm[:n_sne],:].copy()
df_tsne['x-tsne'] = tsne_results[:,0]
df_tsne['y-tsne'] = tsne_results[:,1]

chart = ggplot( df_tsne, aes(x='x-tsne', y='y-tsne', color='label') ) \
        + geom_point(size=15,alpha=0.8) \
        + ggtitle("tSNE dimensions colored by digit")
chart

<ggplot: (5784710)>

也可以先用PCA或TruncatedSVD处理数据,留下例如50个字符,然后用t-SNE减小维度值。但是,要记住,计算t-SNE的复杂度会随着样本数的平方而增加,分别是,如果数据集中有几十万或几百万个对象,这种方法就变得不切实际了。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值