Десять способов добиться уменьшения размерности в наборах данных изображений

анализ данных

содержание

1. Получите набор данных

2. Визуализация набора данных

3. Снижение размерности и визуализация

3.1, Случайное уменьшение размерности проекции

3.2, уменьшение размерности PCA

3.3, уменьшение размерности усеченного СВД

3.4, уменьшение размерности LDA

3.5, уменьшение размерности МДС

3.6, Снижение размерности Isomap

3.7, уменьшение размерности LLE

3.7.1, стандартный LLE

3.7.2, модифицированный LLE

3.7.3. Гессен LLE

3.7.4. LTSA

3.8, уменьшение размерности t-SNE

3.9, уменьшение размерности RandomTrees

3.10, Уменьшение размера спектрального вложения

4. Резюме


Уменьшение размерности — это операция, которая преобразует одно изображение в набор данных в многомерном пространстве посредством увеличения размерности данных одного изображения. Так называемое уменьшение размерности в области машинного обучения относится к использованию определенного метода сопоставления для сопоставления точек данных в исходном пространстве высокой размерности с пространством низкой размерности. Суть уменьшения размерности заключается в изучении функции отображения f : x->y, где x — выражение исходной точки данных, а векторное представление в настоящее время используется максимум. y представляет собой низкоразмерное векторное представление после отображения точек данных, обычно размерность y меньше, чем размерность x (конечно, также возможно увеличить размерность). f может быть явным или неявным, линейным или нелинейным.

Этот проект будет опираться на набор данных MNIST для реализации уменьшения размерности набора данных изображения.

Набор данных MNIST поступает от Национального института стандартов и технологий и представляет собой набор данных компьютерного зрения начального уровня. Он состоит из 60 000 обучающих изображений и 10 000 тестовых изображений, которые представляют собой написанные от руки числа от 0 до 9, 50% от старшеклассников США и 50% от сотрудников Бюро переписи населения. Цифровые изображения предварительно обработаны и отформатированы, они черно-белые, с измененным размером (28x28 пикселей) и центрированы. Эффект набора данных MNIST показан на следующем рисунке:

1. Получите набор данных

В этом случае выберите непосредственно изsklearn.datasetsчерез модульload_digitsИмпортируйте набор данных рукописных цифр из наборов данных UCI.Optical Recognition of Handwritten Digits Data SetТестовый набор в , и это лишь очень маленькое подмножество MNIST, с в общей сложности 1797 рукописных цифровых изображений с разрешением 8 × × 8. При этом на картинке десять видов цифр от 0 до 9.

сначала импортироватьload_digitsМодули и сопутствующие пакеты, необходимые для этого случая, код реализации выглядит следующим образом:

from time import time # 用于计算运行时间
import matplotlib.pyplot as plt 
import numpy as np
from matplotlib import offsetbox # 定义图形box的格式
from sklearn import (manifold, datasets, decomposition, ensemble,
                     discriminant_analysis, random_projection) 

load_digitsимеютn_classПараметр, вы можете указать, сколько типов картинок извлекать (начиная с цифры 0), значение по умолчанию равно10;есть еще одинreturn_X_yпараметр (новый в sklearn версии 0.18), если значение параметра равноTrue, данные изображения возвращаютсяdataи этикеткиtarget, По умолчаниюFalse.return_X_yзаFalse, вернетBunchобъект, который является подобным словарю объектом, содержащим данныеdata,imagesи полное описание набора данныхDESCR.

Два метода чтения показаны ниже:

Способ 1: вернуть объект Bunch, код реализации следующий:

digits = datasets.load_digits(n_class=6)
print(digits)
# 获取bunch中的data,target
print(digits.data)
print(digits.target)

Результат выглядит следующим образом:

[[  0.   0.   5. ...,   0.   0.   0.]
 [  0.   0.   0. ...,  10.   0.   0.]
 [  0.   0.   0. ...,  16.   9.   0.]
 ..., 
 [  0.   0.   0. ...,   9.   0.   0.]
 [  0.   0.   0. ...,   4.   0.   0.]
 [  0.   0.   6. ...,   6.   0.   0.]]
[0 1 2 ..., 4 4 0]

Способ 2: возвращать только данные и цель, код реализации выглядит следующим образом:

data = datasets.load_digits(n_class=6)
print(data)

Результат выглядит следующим образом:

{'images': array([[[  0.,   0.,   5., ...,   1.,   0.,   0.],
        [  0.,   0.,  13., ...,  15.,   5.,   0.],
        [  0.,   3.,  15., ...,  11.,   8.,   0.],
        ..., 
        [  0.,   4.,  11., ...,  12.,   7.,   0.],
        [  0.,   2.,  14., ...,  12.,   0.,   0.],
        [  0.,   0.,   6., ...,   0.,   0.,   0.]],

       [[  0.,   0.,   0., ...,   5.,   0.,   0.],
        [  0.,   0.,   0., ...,   9.,   0.,   0.],
        [  0.,   0.,   3., ...,   6.,   0.,   0.],
        ..., 
        [  0.,   0.,   1., ...,   6.,   0.,   0.],
        [  0.,   0.,   1., ...,   6.,   0.,   0.],
        [  0.,   0.,   0., ...,  10.,   0.,   0.]],

       [[  0.,   0.,   0., ...,  12.,   0.,   0.],
        [  0.,   0.,   3., ...,  14.,   0.,   0.],
        [  0.,   0.,   8., ...,  16.,   0.,   0.],
        ..., 
        [  0.,   9.,  16., ...,   0.,   0.,   0.],
        [  0.,   3.,  13., ...,  11.,   5.,   0.],
        [  0.,   0.,   0., ...,  16.,   9.,   0.]],

       ..., 
       [[  0.,   0.,   0., ...,   6.,   0.,   0.],
        [  0.,   0.,   0., ...,   2.,   0.,   0.],
        [  0.,   0.,   8., ...,   1.,   2.,   0.],
        ..., 
        [  0.,  12.,  16., ...,  16.,   1.,   0.],
        [  0.,   1.,   7., ...,  13.,   0.,   0.],
        [  0.,   0.,   0., ...,   9.,   0.,   0.]],

       [[  0.,   0.,   0., ...,   4.,   0.,   0.],
        [  0.,   0.,   4., ...,   0.,   0.,   0.],
        [  0.,   0.,  12., ...,   4.,   3.,   0.],
        ..., 
        [  0.,  12.,  16., ...,  13.,   0.,   0.],
        [  0.,   0.,   4., ...,   8.,   0.,   0.],
        [  0.,   0.,   0., ...,   4.,   0.,   0.]],

       [[  0.,   0.,   6., ...,  11.,   1.,   0.],
        [  0.,   0.,  16., ...,  16.,   1.,   0.],
        [  0.,   3.,  16., ...,  13.,   6.,   0.],
        ..., 
        [  0.,   5.,  16., ...,  16.,   5.,   0.],
        [  0.,   1.,  15., ...,  16.,   1.,   0.],
        [  0.,   0.,   6., ...,   6.,   0.,   0.]]]), 'data': array([[  0.,   0.,   5., ...,   0.,   0.,   0.],
       [  0.,   0.,   0., ...,  10.,   0.,   0.],
       [  0.,   0.,   0., ...,  16.,   9.,   0.],
       ..., 
       [  0.,   0.,   0., ...,   9.,   0.,   0.],
       [  0.,   0.,   0., ...,   4.,   0.,   0.],
       [  0.,   0.,   6., ...,   6.,   0.,   0.]]), 'target_names': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 'DESCR': "Optical Recognition of Handwritten Digits Data Set\n===================================================\n\nNotes\n-----\nData Set Characteristics:\n    :Number of Instances: 5620\n    :Number of Attributes: 64\n    :Attribute Information: 8x8 image of integer pixels in the range 0..16.\n    :Missing Attribute Values: None\n    :Creator: E. Alpaydin (alpaydin '@' boun.edu.tr)\n    :Date: July; 1998\n\nThis is a copy of the test set of the UCI ML hand-written digits datasets\nhttp://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits\n\nThe data set contains images of hand-written digits: 10 classes where\neach class refers to a digit.\n\nPreprocessing programs made available by NIST were used to extract\nnormalized bitmaps of handwritten digits from a preprinted form. From a\ntotal of 43 people, 30 contributed to the training set and different 13\nto the test set. 32x32 bitmaps are divided into nonoverlapping blocks of\n4x4 and the number of on pixels are counted in each block. This generates\nan input matrix of 8x8 where each element is an integer in the range\n0..16. This reduces dimensionality and gives invariance to small\ndistortions.\n\nFor info on NIST preprocessing routines, see M. D. Garris, J. L. Blue, G.\nT. Candela, D. L. Dimmick, J. Geist, P. J. Grother, S. A. Janet, and C.\nL. Wilson, NIST Form-Based Handprint Recognition System, NISTIR 5469,\n1994.\n\nReferences\n----------\n  - C. Kaynak (1995) Methods of Combining Multiple Classifiers and Their\n    Applications to Handwritten Digit Recognition, MSc Thesis, Institute of\n    Graduate Studies in Science and Engineering, Bogazici University.\n  - E. Alpaydin, C. Kaynak (1998) Cascading Classifiers, Kybernetika.\n  - Ken Tang and Ponnuthurai N. Suganthan and Xi Yao and A. Kai Qin.\n    Linear dimensionalityreduction using relevance weighted LDA. School of\n    Electrical and Electronic Engineering Nanyang Technological University.\n    2005.\n  - Claudio Gentile. A New Approximate Maximal Margin Classification\n    Algorithm. NIPS. 2000.\n", 'target': array([0, 1, 2, ..., 4, 4, 0])}

В этом случае для уменьшения размерности извлекаются только картинки от номера 0 до номера 5. Мы выбираем первые шесть фотографий в наборе данных изображения для отображения.Код реализации выглядит следующим образом:

# plt.gray() 
fig, axes = plt.subplots(nrows=1, ncols=6, figsize=(8, 8))
for i,ax in zip(range(6),axes.flatten()):
    ax.imshow(digits.images[i], cmap=plt.cm.gray_r)
plt.show()

Эффект следующий:

Для удобного отображения рукописного цифрового изображения используйте возвратBunchМетод импорта объекта, код реализации следующий:

digits = datasets.load_digits(n_class=6)
X = digits.data
y = digits.target
n_samples, n_features = X.shape
n_neighbors = 30

2. Визуализация набора данных

Визуально отобразите часть изображения данных набора данных, а код реализации выглядит следующим образом:

n_img_per_row = 30 # 每行显示30个图片

# 整个图形占 300*300,由于一张图片为8*8,所以每张图片周围包了一层白框,防止图片之间互相影响
img = np.zeros((10 * n_img_per_row, 10 * n_img_per_row))

for i in range(n_img_per_row):
    ix = 10 * i + 1
    for j in range(n_img_per_row):
        iy = 10 * j + 1
        img[ix:ix + 8, iy:iy + 8] = X[i * n_img_per_row + j].reshape((8, 8))  
plt.figure(figsize=(6,6))
plt.imshow(img, cmap=plt.cm.binary)
plt.xticks([])
plt.yticks([])
plt.title('A selection from the 64-dimensional digits dataset')

Эффект следующий:

3. Снижение размерности и визуализация

Данные изображения — это своего рода многомерные данные (от десятков до миллионов измерений).Если каждое изображение рассматривать как точку в многомерном пространстве, то крайне сложно отобразить эти точки в многомерном пространстве, поэтому Нам нужно уменьшить размерность этих данных и увидеть встроенную структуру всего набора данных в двумерном или трехмерном пространстве.

Метод уменьшения размерности, который будет показан в этом случае, и модуль sklearn, в котором он находится, показаны в следующей таблице:

Процесс вызова вышеуказанных методов для уменьшения размерности аналогичен:

  • Сначала создайте экземпляр в соответствии с конкретным методом:实例名 = sklearn模块.调用的方法(一些参数的设置)
  • Затем преобразуйте данные:转换后的数据变量名 = 实例名.fit_transform(X), в некоторых методах, таких как уменьшение размерности LDA, также необходимо предоставлять меткиy
  • Наконец, визуализируйте преобразованные данные: введите преобразованные данные и заголовок и нарисуйте график в двухмерном пространстве.

Чтобы облегчить рисование и унифицировать стиль рисования, сначала определитеplot_embeddingФункция используется для рисования низкоразмерных встроенных графов.

Цветовая схема выглядит так:

  • Зеленый #5dbe80
  • синий #2d9ed8
  • Фиолетовый # a290c4
  • Оранжевый #efab40
  • красный #eb4e4f
  • серый #929591

Код реализации выглядит следующим образом:

# 首先定义函数画出二维空间中的样本点,输入参数:1.降维后的数据;2.图片标题

def plot_embedding(X, title=None):
    x_min, x_max = np.min(X, 0), np.max(X, 0)
    X = (X - x_min) / (x_max - x_min) # 对每一个维度进行0-1归一化,注意此时X只有两个维度
    
    plt.figure(figsize= (6,6)) # 设置整个图形大小
    ax = plt.subplot(111)
    colors = ['#5dbe80','#2d9ed8','#a290c4','#efab40','#eb4e4f','#929591']
    
    # 画出样本点
    for i in range(X.shape[0]): # 每一行代表一个样本
        plt.text(X[i, 0], X[i, 1], str(digits.target[i]),
                 #color=plt.cm.Set1(y[i] / 10.),
                 color=colors[y[i]],
                 fontdict={'weight': 'bold', 'size': 9})  # 在样本点所在位置画出样本点的数字标签
    
    # 在样本点上画出缩略图,并保证缩略图够稀疏不至于相互覆盖
    # 只有matplotlib 1.0版本以上,offsetbox才有'AnnotationBbox',所以需要先判断是否有这个功能
    if hasattr(offsetbox, 'AnnotationBbox'): 
        shown_images = np.array([[1., 1.]])  # 假设最开始出现的缩略图在(1,1)位置上
        for i in range(digits.data.shape[0]):
            dist = np.sum((X[i] - shown_images) ** 2, 1) # 算出样本点与所有展示过的图片(shown_images)的距离
            if np.min(dist) < 4e-3: # 若最小的距离小于4e-3,即存在有两个样本点靠的很近的情况,则通过continue跳过展示该数字图片缩略图
                continue
            shown_images = np.r_[shown_images, [X[i]]] # 展示缩略图的样本点通过纵向拼接加入到shown_images矩阵中
            
            imagebox = offsetbox.AnnotationBbox(
                offsetbox.OffsetImage(digits.images[i], cmap=plt.cm.gray_r),
                X[i])
            ax.add_artist(imagebox)
            
    plt.xticks([]), plt.yticks([]) # 不显示横纵坐标刻度
    if title is not None: 
        plt.title(title) 

3.1, Случайное уменьшение размерности проекции

Случайная проекция — простейший метод уменьшения размерности. Этот метод может показать пространственную структуру всех данных только в небольшой степени и потеряет большую часть структурной информации, поэтому этот метод уменьшения размерности используется редко Код реализации выглядит следующим образом:

t0 = time() 
rp = random_projection.SparseRandomProjection(n_components=2, random_state=66)
X_projected = rp.fit_transform(X)
plot_embedding(X_projected, 
               "Random Projection of the digits (time %.2fs)" %
               (time() - t0))

Эффект следующий:

3.2, уменьшение размерности PCA

Уменьшение размерности PCA является наиболее часто используемым методом линейного уменьшения размерности без учителя. Снижение размерности PCA на самом деле представляет собой метод уменьшения линейной размерности, который выполняет разложение SVD на ковариационной матрице для уменьшения размерности.Код реализации выглядит следующим образом:

t0 = time()
pca = decomposition.PCA(n_components=2)
X_pca = pca.fit_transform(X)
plot_embedding(X_pca,
               "Principal Components projection of the digits (time %.2fs)" %
               (time() - t0))
print pca.explained_variance_ratio_ # 每一个成分对原数据的方差解释了百分之多少

Эффект следующий:

3.3, уменьшение размерности усеченного СВД

Усеченный метод SVD использует усеченный метод декомпозиции SVD для линейного сокращения данных. В отличие от PCA, этот метод не центрирует данные до разложения SVD, что означает, что метод может эффективно обрабатывать разреженные матрицы, такие какscipy.sparseопределенная разреженная матрица, которая не поддерживается методом PCAscipy.sparseРазреженный матричный ввод. В области анализа текста этот метод может выполнять декомпозицию SVD на матрице частоты разреженных слов / tf-idf, то есть LSA (латентный семантический анализ), Код реализации выглядит следующим образом:

t0 = time()
svd = decomposition.TruncatedSVD(n_components=2)
X_svd = svd.fit_transform(X)
plot_embedding(X_svd,
               "Principal Components projection of the digits (time %.2fs)" %
               (time() - t0))

Эффект следующий:

3.4, уменьшение размерности LDA

Метод уменьшения размерности LDA использует информацию о метках исходных данных, поэтому после уменьшения размерности точки выборки одного класса в низкоразмерном пространстве собираются вместе, а точки разных классов разделяются и сравниваются. как следует:

X2 = X.copy()
X2.flat[::X.shape[1] + 1] += 0.01  # 使得X可逆
t0 = time()
lda = discriminant_analysis.LinearDiscriminantAnalysis(n_components=2)
X_lda = lda.fit_transform(X2, y)
plot_embedding(X_lda,
               "Linear Discriminant projection of the digits (time %.2fs)" %
               (time() - t0))

Эффект следующий:

3.5, уменьшение размерности МДС

Если существует отношение расстояния между точками выборки, аналогичное географическому положению между городами, вы можете использовать MDS для уменьшения размерности, чтобы сохранить это отношение расстояния в низкоразмерном пространстве.Код реализации выглядит следующим образом:

clf = manifold.MDS(n_components=2, n_init=1, max_iter=100)
t0 = time()
X_mds = clf.fit_transform(X)
plot_embedding(X_mds,
               "MDS embedding of the digits (time %.2fs)" %
               (time() - t0))

Эффект следующий:

3.6, Снижение размерности Isomap

Isomap — это своего рода многообразный метод обучения, который является сокращением от Isometric mapping. Этот метод можно рассматривать как расширение метода MDS. В отличие от MDS, этот метод поддерживает связь геодезических расстояний между всеми точками данных до и после уменьшения размерности.

Isomap необходимо указать количество ближайших соседей в поле, которое мы указали как 30 при извлечении данных изображения. Из-за необходимости вычисления геодезического расстояния точек выборки этот метод занимает много времени, код реализации выглядит следующим образом:

t0 = time()
iso = manifold.Isomap(n_neighbors, n_components=2)
X_iso = iso.fit_transform(X)
plot_embedding(X_iso,
               "Isomap projection of the digits (time %.2fs)" %
               (time() - t0))

Эффект следующий:

3.7, уменьшение размерности LLE

Для уменьшения размерности LLE также необходимо указать количество точек выборки в поле.n_neighbors, уменьшение размерности LLE поддерживает отношение расстояния между точками выборки в окрестности, что можно понимать как серию локальных операций PCA, но глобально сохраняет неструктурированную информацию данных. Снижение размерности LLE в основном включает четыре методаstandard,modified,hessianиltsa, показанные один за другим ниже, и вывести их ошибки реконструкции (ошибки при восстановлении данных в исходном пространстве из данных в пространстве низкой размерности).

3.7.1, стандартный LLE

Стандартный код реализации уменьшения размерности LLE выглядит следующим образом:

clf = manifold.LocallyLinearEmbedding(n_neighbors, n_components=2, method='standard')
t0 = time() 
X_lle = clf.fit_transform(X)
plot_embedding(X_lle,
               "Locally Linear Embedding of the digits (time %.2fs)" %
               (time() - t0))

Результаты, как показано ниже:

3.7.2, модифицированный LLE

Стандартный LLE имеет проблему регуляризации: когда n_neighbors больше, чем размерность входных данных, матрица локального соседства будет иметь проблему дефицита ранга. Для решения этой проблемы вводится параметр регуляризации ?r на основе стандартного LLE. По настройке параметровmethond='modified', вы можете добиться модифицированного уменьшения размерности LLE, код реализации выглядит следующим образом:

clf = manifold.LocallyLinearEmbedding(n_neighbors, n_components=2, method='modified')
t0 = time()
X_mlle = clf.fit_transform(X)
plot_embedding(X_mlle,
               "Modified Locally Linear Embedding of the digits (time %.2fs)" %
               (time() - t0))

Эффект следующий:

3.7.3. Гессен LLE

Hessian LLE, также известный как Hessian Eigenmapping, является еще одним способом решения проблемы регуляризации LLE. Суть использования этого метода заключается в удовлетворенииn_neighbors > n_components * (n_components + 3) / 2,实现代码如下所示:

clf = manifold.LocallyLinearEmbedding(n_neighbors, n_components=2, method='hessian')
t0 = time()
X_hlle = clf.fit_transform(X)
plot_embedding(X_hlle,
               "Hessian Locally Linear Embedding of the digits (time %.2fs)" %
               (time() - t0))

Эффект следующий:

3.7.4. LTSA

Метод LTSA (локальное выравнивание касательного пространства) на самом деле не является вариантом LLE, но классифицируется как LocallyLinearEmbedding, поскольку он похож на алгоритм LLE. В отличие от LLE, который поддерживает отношение расстояния между соседними точками до и после уменьшения размерности, LTSA описывает географические свойства между точками выборки по соседству, помещая данные в касательное пространство Код реализации выглядит следующим образом:

clf = manifold.LocallyLinearEmbedding(n_neighbors, n_components=2, method='ltsa')
t0 = time()
X_ltsa = clf.fit_transform(X)
plot_embedding(X_ltsa,
               "Local Tangent Space Alignment of the digits (time %.2fs)" %
               (time() - t0))

Эффект следующий:

3.8, уменьшение размерности t-SNE

В этом примере для инициализации t-SNE используются вложения, сгенерированные PCA, вместо настроек t-SNE по умолчанию (т. е.init='pca'). Это обеспечивает глобальную устойчивость вложения, т.е. вложение не зависит от случайной инициализации.

Метод t-SNE чувствителен к локальной структурной информации данных и имеет много преимуществ:

  • выявляет образцы, принадлежащие разным многообразиям или кластерам
  • Уменьшенное агрегирование образцов

Конечно, у него есть и много недостатков:

  • Вычислительные затраты высоки, и для обработки миллионов данных изображений требуется несколько часов, в то время как для той же задачи PCA занимает всего несколько минут или несколько секунд;
  • Алгоритм является случайным, и разные случайные начальные числа будут давать разные результаты уменьшения размерности. Конечно, выбирая разные случайные начальные числа, можно выбрать случайное начальное число с наименьшей ошибкой реконструкции в качестве окончательного параметра для выполнения уменьшения размерности;
  • Глобальная структура плохо сохраняется, но эту проблему можно решить, используя начальные точки выборки PCA (init='pca').

Код реализации выглядит следующим образом:

tsne = manifold.TSNE(n_components=2, init='pca', random_state=10) # 生成tsne实例
t0 = time()  # 执行降维之前的时刻
X_tsne = tsne.fit_transform(X) # 降维得到二维空间中的数据
plot_embedding(X_tsne, "t-SNE embedding of the digits (time %.2fs)" % (time() - t0)) # 画出降维后的嵌入图形
plt.show()

Эффект следующий:

3.9, уменьшение размерности RandomTrees

отsklearn.ensembleмодульныйRandomTreesEmbeddingС технической точки зрения это не метод многомерного встраивания, но он изучает многомерное представление данных и может использоваться в методах уменьшения размерности данных. можно использовать в первую очередьRandomTreesEmbeddingВысокоразмерное представление данных, а затем использование PCA или усеченного SVD для уменьшения размерности, код реализации выглядит следующим образом:

hasher = ensemble.RandomTreesEmbedding(n_estimators=200, random_state=0, max_depth=5)
t0 = time()
X_transformed = hasher.fit_transform(X)
pca = decomposition.TruncatedSVD(n_components=2)
X_reduced = pca.fit_transform(X_transformed)
plot_embedding(X_reduced,
               "Random forest embedding of the digits (time %.2fs)" %
               (time() - t0))

Эффект следующий:

3.10, Уменьшение размера спектрального вложения

Спектральное вложение, также называемое лапласовскими собственными картами (лапласианская карта признаков). Он использует спектральное разложение графа Лапласа, чтобы найти представление данных в низкоразмерном пространстве.Код реализации выглядит следующим образом:

embedder = manifold.SpectralEmbedding(n_components=2, random_state=0, eigen_solver="arpack")
t0 = time()
X_se = embedder.fit_transform(X)
plot_embedding(X_se,
               "Spectral embedding of the digits (time %.2fs)" %
               (time() - t0))

Эффект следующий:

4. Резюме

В этом случае для уменьшения и визуализации рукописных данных цифрового изображения используются различные методы уменьшения размерности, включая методы PCA, LDA и методы уменьшения размерности, основанные на многообразном обучении.

Методы уменьшения линейной размерности, включая PCA и LDA, требуют меньше времени, но этот метод уменьшения линейной размерности будет терять нелинейную структурную информацию в многомерном пространстве. Для сравнения, многообразный метод обучения в методе нелинейного уменьшения размерности (KPCA и KLDA здесь не упоминаются, если вам интересно, вы можете попробовать эти два типа методов нелинейного уменьшения размерности) может хорошо сохраняться в многомерном пространстве. нелинейная структурная информация. Хотя типичное многообразное обучение представляет собой подход без учителя, существуют некоторые варианты подходов с учителем.

При выполнении уменьшения размерности данных мы должны выяснить, является ли целью нашего уменьшения размерности выполнение извлечения признаков, чтобы сделать последующую модель более интерпретируемой или улучшить эффект, или просто визуализировать многомерные данные. При выборе методов уменьшения размерности также следует стараться сбалансировать временные затраты и эффект уменьшения размерности.

Кроме того, при уменьшении размерности необходимо обратить внимание на следующие моменты:

  • До уменьшения размерности масштабы всех признаков одинаковы;
  • Ошибку реконструкции можно использовать для нахождения оптимальной выходной размерности ?d (в настоящее время уменьшение размерности не только для визуализации).По мере увеличения размерности ?d ошибка реконструкции будет уменьшаться, пока не достигнет порога, установленного реализацией;
  • Точки шума могут вызвать «короткое замыкание» в коллекторе, то есть две части, которые легко отделяются в коллекторе, соединяются между собой точкой шума как «мост»;
  • Некоторые типы входных данных могут привести к тому, что матрица весов будет единственной, например, в наборе данных, где более двух точек выборки совпадают, или точки выборки сгруппированы в непересекающиеся группы. В этом случае реализация разложения по собственным значениямsolver='arpack'Пустое пространство не будет найдено. Самый простой способ исправить это — использоватьsolver='dense'реализует разложение по собственным значениям, хотяdenseМожет быть медленнее, но его можно использовать на сингулярных матрицах. Кроме того, мы также можем думать о решениях, понимая причины сингулярности: если она вызвана непересекающимися множествами, мы можем попробоватьn_neighborsУвеличение; если это связано с теми же точками выборки в наборе данных, вы можете попытаться удалить эти повторяющиеся точки выборки и оставить только одну из них.