gpt4 book ai didi

python - 高维数据的自动编码器

转载 作者:太空宇宙 更新时间:2023-11-03 14:17:08 25 4
gpt4 key购买 nike

我正在开展一个项目,我需要降低观察的维度,但仍能有效地表示它们。出于多种原因强烈建议使用自动编码器,但我不太确定这是最佳方法。

我有 1400 个维度约为 60,000 的样本,这太高了,我正试图将它们的维度降低到原始维度的 10%。我正在使用 theano 自动编码器 [ Link 】 而且成本好像一直在3万左右(很高)。我尝试增加 epochs 的数量或降低学习率但没有成功。我不是自动编码器方面的专家,所以我不确定如何从这里开始或何时停止尝试。

我还可以运行其他测试,但在继续之前,我想听听您的意见。

  • 您是否认为数据集太小(我可以再添加 600 个样本,总共约 2000 个样本)?

  • 您认为使用堆叠自动编码器会有帮助吗?

  • 我应该继续调整参数(周期和学习率)吗?

由于数据集是图片的集合,我尝试可视化自动编码器的重建结果,而我得到的只是每个样本的相同输出。这意味着给定输入,自动编码器会尝试重建输入,但我得到的是任何输入的相同(几乎完全)图像(这看起来像是数据集中所有图像的平均值)。这意味着内部表示不够好,因为自动编码器无法从中重建图像。

数据集:1400 - 2000 张扫描书籍图像(包括封面),每张约 60.000 像素(转换为包含 60.000 个元素的特征向量)。每个特征向量都在 [0,1] 中归一化,最初的值在 [0,255] 中。

问题:使用自动编码器降低它们的维度(如果可能)

如果您需要任何额外的信息,或者如果我遗漏了一些可能有助于更好地理解问题的信息,请添加评论,我很乐意帮助您 =)。

注意:我目前正在对整个数据集运行更多时期的测试,我会根据结果相应地更新我的帖子,不过这可能需要一段时间。

最佳答案

自动编码器之所以有用,部分原因在于它们可以学习非线性降维。然而,还有其他降维技术,它们比自动编码器快得多。扩散图是一种流行的图;局部线性嵌入是另一种。我已经在 2000 多个 60k 维数据(也包括图像)上使用了扩散图,它在一分钟内就起作用了。

这是一个使用 numpy 等的简单 Python 实现:

def diffusion_maps(data, d, eps=-1, t=1):
"""
data is organized such that columns are points. so it's 60k x 2k for you
d is the target dimension
eps is the kernel bandwidth, estimated automatically if == -1
t is the diffusion time, 1 is usually fine
"""

from scipy.spatial import pdist, squareform
from scipy import linalg as la
import numpy as np

distances = squareform(pdist(data.T))

if eps == -1:
# if a kernel bandwidth was not supplied,
# just use the distance to the tenth-nearest neighbor
k = 10
nn = np.sort(distances)
eps = np.mean(nn[:, k + 1])

kernel = np.exp(-distances ** 2 / eps ** 2)
one = np.ones(n_samples)
p_a = np.dot(kernel, one)
kernel_p = walk / np.outer(p_a, p_a)
dd = np.dot(kernel_p, one) ** 0.5
walk = kernel_p / np.outer(dd, dd)

vecs, eigs, _ = la.svd(walk, full_matrices=False)
vecs = vecs / vecs[:, 0][:, None]
diffusion_coordinates = vecs[:, 1:d + 1].T * (eigs[1:d + 1][:, None] ** t)

return diffusion_coordinates

扩散 map 的要点是您对数据进行随机游走,这样您就更有可能访问附近的点而不是远处的点。然后你可以定义点之间的距离(扩散距离),它本质上是在所有可能路径上两点之间移动的平均概率。诀窍是这实际上非常容易计算;您需要做的就是对角化矩阵,然后使用其特征向量将数据嵌入到低维空间中。在这种嵌入中,欧几里德距离是扩散距离,直到近似误差。

关于python - 高维数据的自动编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32426221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com