【问题标题】:how to find a transformation matrix with sgd如何用 sgd 求变换矩阵
【发布时间】:2018-03-20 04:09:41
【问题描述】:

这似乎很简单,但我无法让事情正常进行。我有 100 维向量空间,每个空间中有几个匹配的向量。我想找到这样的变换矩阵(W):

a_vector[0] 在向量空间 A x W = b_vector[0] 在向量空间 B(或近似值)。

所以一篇论文提到了这个公式。

所以没有我们通常看到的偏差项,没有激活。

我尝试使用 sklearns 线性回归但没有取得多大成功。

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

regression_model = LinearRegression(fit_intercept=True)
regression_model.fit(X_train, y_train)

regression_model.score(X_test, y_test)
> -1451478.4589335269 (!!???)

y_predict = regression_model.predict(X_test)

regression_model_mse = mean_squared_error(y_predict, y_test)

regression_model_mse = 524580.06

尝试了 tensorflow,但没有取得多大成功。不要关心工具——tensorflow、sklearn——只是寻求解决方案的帮助。

谢谢。

编辑

所以我手动滚动了下面的代码 - 余弦 sim 的最大值(表示预测点与实际点的接近程度 - 1.00 = 完美匹配) - 但它非常慢。

shape = (100,100)
W1 = np.random.randn(*shape).astype(np.float64) / np.sqrt(sum(shape))
avgs = []
for x in range(1000):
    shuffle(endevec)
    distance = [0]
for i,x in enumerate(endevec):
    pred1 = x[0].dot(W1) 
    cosine = 1 - scipy.spatial.distance.cosine(pred1, x[1])
    distance.append(cosine)
    diff = pred1 - x[0]
    gradient = W1.T.dot(diff) / W1.shape[0]
    W1 += -gradient * .0001
avgs.append(np.mean(distance))
sys.stdout.write('\r')
# the exact output you're looking for:
sys.stdout.write(str(avgs[-1]))
sys.stdout.flush()

编辑 2

下面的 Jeanne Dark 有一个很好的答案,可以使用以下方法找到变换矩阵: M=np.linalg.lstsq(source_mtrx[:n],target_mtrx[:n])[0]

在我的匹配 vecs 数据集上,使用这种方法找到的 TM 预测的 vecs 是:

minmax=(-0.09405095875263214, 0.9940633773803711)
mean=0.972490919224675 (1.0 being a perfect match) 
variance=0.0011325349465895844
skewness=-18.317443753033665
kurtosis=516.5701661370497

有少量非常大的异常值。

cosine sim 的情节是:

【问题讨论】:

  • 回归/OLS 可能不是正确的工具。仅当我们想在给定 W(设计矩阵)和 z(结果向量)的情况下找到 x 时才合适,但看起来您正在寻找给定 x 和 z 的 W。
  • 但那是论文中特别提到的工具。
  • 我可能误解了你的问题。你能提供一些xy 的例子吗?为什么会有训练集和测试集?或者甚至提供论文的链接?谢谢!
  • X(输入)是向量空间 A 中的 100 个昏暗向量。Y(输出)是向量空间 B 中的 100 个昏暗向量。我想找到这样的变换矩阵
  • X(输入)是向量空间 A 中的 100 个模糊向量。Y(输出)是向量空间 B 中的 100 个模糊向量。这些点是匹配的。我想找到一个转换矩阵,使得 - 来自 A x 矩阵的 vec1 = 来自 B 的 vec1。困难似乎是从 100 暗淡输入到 100 暗淡输出 - 大多数 SGD 通常涉及减少输出暗淡 - 并且输入并且输出是连续的,而不是分类的。这篇论文在下面,但它没有解决这个问题——唯一提到的是我在上面发布的那个。 arxiv.org/abs/1309.4168。谢谢

标签: python matrix transformation stochastic


【解决方案1】:

我昨天遇到了完全相同的问题。我最终使用了numpy.linalg.lstsq ,我认为它有效。

# find tranformation matrix M so that: source_matrix∙M = target_matrix based 
          #on top n most frequent terms in the target corpus
n=500  # the choice of n depends on the size of your vocabulary
M=np.linalg.lstsq(source_mtrx[:n],target_mtrx[:n])[0]
print M.shape # returns (100,100)

# apply this tranformation to source matrix:
new_mtrx= np.array([np.dot(i, M) for i in source_mtrx])

还可以查看这篇论文Lexical Comparison Between Wikipedia and Twitter Corpora by Using Word Embeddings。它们基于您提到的论文,它们遵循相同的方法,但它们更详细地解释了实现。例如,他们建议为了找到变换矩阵 M,我们只使用前 n 个最频繁项的向量,然后,在将变换应用于源矩阵之后,我们计算其余术语的相似性。

如果你找到另一种基于 SGD 计算 M 的解决方案,请告诉我。

【讨论】:

  • 感谢您的帮助珍妮。 linalg 工作得非常好而且非常快。对于我的匹配的VECS,描述统计数据是:Minmax =( - 0.09405095875263214,20.94063373803711),平均值= 0.9724909192224675,方差= 0.0011325349465895844,Skewness = -18.317443753033665,Kurtosis = 516.5701661370497) span>
  • 感谢您的帮助。我在上面添加了您的建议和结果摘要。
  • 我很高兴它成功了 :)。请问您使用的是什么数据集,它的大小是多少?我正在使用一个很小的模型,所以我的结果还不是很好,但是一旦我可以访问数据,我打算将模型用于更大的模型
  • 我正在使用自定义数据集。它实际上是文档向量而不是词向量。数据集大约有 5000-6000 个文档。我实际上是在尝试通过获取一个子集来找到一个准确的映射 - 获取 5000 个 doc vecs 的转换矩阵,以获得两组 50000 个的相当准确的映射。
猜你喜欢
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
相关资源
最近更新 更多