1

我正在尝试用 python 实现一个简单的公式。在“RLSR”的情况下,有两种方法可以通过 C=k^-1*y 计算系数“C”,其中 k 是内核矩阵,y 是目标值向量。

第二种方法是使用核方法的特征值(w)和特征向量(v)并使用公式:

Sum(u(i)*<u(i),y> / w(i) ). 

要检查结果的答案,我正在检查 y=kc 与否!在第一种情况下没关系,但在后一种情况下不是。但问题是我在两种方法中的 c 向量看起来都一样。

算法的输出:

[ 19.49840251  18.82695226  20.08390355  15.01043404  14.79353281
  16.75316736  12.88504257  16.92127176  16.77292954  17.81827473
  20.90503787  17.09359467  18.76366701  18.14816903  20.03491117
  22.56668264  21.45176136  25.44051036  30.40312692  22.61466379
  22.86480382  19.34631818  17.0169598   19.85244414  16.63702471
  20.35280156  20.58093488  22.42058736  20.54935198  19.35541575
  20.39006958  19.74766081  20.41781019  22.33858797  17.57962283
  22.61915219  22.54823733  24.96292824  22.82888425  34.18952603
  20.7487537   24.82019935  22.40621769  21.15767304  27.58919263
  18.39293156  21.55455108  18.69532341]

第二(特征分解)算法的输出:

[ 19.25280289  18.73927731  19.77184991  14.7650427   14.87364331
  16.2273648   12.29183797  16.52024239  16.66669961  17.59282615
  20.83059115  17.02815857  18.3635798   18.16931845  20.50528549
  22.67690164  21.40479524  25.54544     30.94618128  22.72992565
  23.06289609  17.6485592   15.2758427   19.50578691  16.45571607
  20.19960765  20.35352859  22.60091638  20.36586912  18.90760728
  20.57141151  19.43677153  20.43437031  22.39310576  17.72296978
  22.82139991  22.50744791  25.10496617  22.30462867  34.80540213
  20.77064617  25.18071618  22.5500315   20.71481252  27.91939784
  18.29868659  22.00800019  18.71266093]

这就是我实现它的方式:假设我们有 48 个样本,K 的大小是 48x48 ,y 是 48x1

def cpu_compute(y,k):

    w, u=LA.eigh(k)
    uDoty=np.dot(u,y)
    temp=np.transpose(np.tile(w,(len(u),1)))
    div=np.divide(u,temp)

    r=np.tile(uDoty,(len(div),1))
    a=div*r.T
    c=sum(a)

    return c

结果来自

print np.allclose(Y,np.dot(K,c))

是假的。

与真实结果的差异范数也是3.13014997999

现在我不知道如何解决这个问题。我想也许可以通过更准确的答案来做一些事情。

感谢任何帮助!

4

1 回答 1

0

要使用 numpy 解决kc = y,请使用numpy.linalg.solve

c = solve(k, y)

这使用的算法比您尝试的方法更强大。

于 2012-09-14T01:22:08.177 回答