Уменьшение размеров - применить LLE после PCA, чтобы набор данных mnist не работал - PullRequest
0 голосов
/ 21 июня 2019

Я читал, что, поскольку LLE-манифольд намного медленнее, чем PCA, целесообразно использовать PCA, а затем применять LLE, чтобы уменьшить больше измерений.

Я хочу уменьшить размеры цифр из набора данных mnist (этоначать с 28X28).Это мой код:

import matplotlib.pyplot as plt
import matplotlib as mpl

def showdigit(digit):
    plt.imshow(digit, cmap = mpl.cm.binary, interpolation="nearest")
    plt.axis("off")
some_digit = X[10000] 
some_digit = some_digit.reshape(28, 28)
showdigit(some_digit)

plt.show()

(Это показывает изображение оригинальной цифры.)

#PCA
from sklearn.decomposition import PCA 
pca = PCA(n_components=0.95)
X_reduced = pca.fit_transform(some_digit)
showdigit(X_reduced)

Я получаю (26,8) изображение X_reduced.

Теперь я хочу применить коллектор LLE для вывода PCA:

#Manifold
from sklearn.manifold import LocallyLinearEmbedding
lle = LocallyLinearEmbedding(n_components=20, n_neighbors=10)
X_redu = lle.fit_transform(X_reduced)
showdigit(X_redu)

Я получаю ошибку: "ValueError: выходное измерение должно быть меньше или равно входному измерению" .

И если, например, я изменяю n_components = 0,9, я получаю "ValueError: не удалось создать намерение (кэш | скрыть) | необязательный массив - должны быть определены размеры, но получено (28,0,) "

Подскажите, в чем здесь проблема?


Ps.Это первая ячейка кода (взято из hanson-ml ):

import numpy as np
import os

def sort_by_target(mnist):
    reorder_train = np.array(sorted([(target, i) for i, target in enumerate(mnist.target[:60000])]))[:, 1]
    reorder_test = np.array(sorted([(target, i) for i, target in enumerate(mnist.target[60000:])]))[:, 1]
    mnist.data[:60000] = mnist.data[reorder_train]
    mnist.target[:60000] = mnist.target[reorder_train]
    mnist.data[60000:] = mnist.data[reorder_test + 60000]
    mnist.target[60000:] = mnist.target[reorder_test + 60000]

try:
    from sklearn.datasets import fetch_openml
    mnist = fetch_openml('mnist_784', version=1, cache=True)
    mnist.target = mnist.target.astype(np.int8) # fetch_openml() returns targets as strings
    sort_by_target(mnist) # fetch_openml() returns an unsorted dataset
except ImportError:
    from sklearn.datasets import fetch_mldata
    mnist = fetch_mldata('MNIST original')
mnist["data"], mnist["target"]
X, y = mnist["data"], mnist["target"]
...