содержание
3. Снижение размерности и визуализация
3.1, Случайное уменьшение размерности проекции
3.2, уменьшение размерности PCA
3.3, уменьшение размерности усеченного СВД
3.4, уменьшение размерности LDA
3.5, уменьшение размерности МДС
3.6, Снижение размерности Isomap
3.7, уменьшение размерности LLE
3.8, уменьшение размерности t-SNE
3.9, уменьшение размерности RandomTrees
3.10, Уменьшение размера спектрального вложения
Уменьшение размерности — это операция, которая преобразует одно изображение в набор данных в многомерном пространстве посредством увеличения размерности данных одного изображения. Так называемое уменьшение размерности в области машинного обучения относится к использованию определенного метода сопоставления для сопоставления точек данных в исходном пространстве высокой размерности с пространством низкой размерности. Суть уменьшения размерности заключается в изучении функции отображения 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
Увеличение; если это связано с теми же точками выборки в наборе данных, вы можете попытаться удалить эти повторяющиеся точки выборки и оставить только одну из них.