欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-02 14:23:44
...

 

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

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

数据转换为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))

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

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

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();

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

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_))

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

前三个部分描述了原始数据分布的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

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

<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))

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

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

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

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

<ggplot: (5784710)>

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

相关标签: Python