微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将向量 / csr 矩阵行乘以 numpy / scipy 中的“梯度下降”权重

如何解决将向量 / csr 矩阵行乘以 numpy / scipy 中的“梯度下降”权重

我有一个 csr matrix,我的想法是将每一行乘以与矩阵行中最大值顺序相关的权重。如果该行有 5 个非零值,则将最大值乘以 5(归一化),第二个乘以 4,以此类推。

实际上是受WMA in trading的启发,所以在5个值的情况下,最大乘以5/(5+4+3..1)(权重总和)。

是否有任何优化的算法可以在 numpy 或 scipy 中执行此操作?

解决方法

我会做这样的事情:

from scipy.sparse import csr_matrix
M = csr_matrix([2,4],dtype=np.float64)
NZ = np.nonzero(M.getrow(0).A[0])[0]
for k,v in enumerate(np.flip(np.argsort(M.getrow(0).A[0][NZ]))):
    M[0,NZ[v]] *= ((len(NZ)-k) / (len(NZ) * (len(NZ) + 1) // 2))

结果矩阵 M 为:

array([[0.66666667,0.,2.66666667]])

============================================

下面是另一个解决方案,但它使用排序,这是我不想要的,我意识到:

x = np.array([3,1,2]) # row of a matrix
s = np.argsort(x)     # indexes representing ordered values (asc order)
s = np.flip(s)        # flipping asc to desc
y = x[s] * [(len(x)-k)/x.sum() for k,v in enumerate(s)] # do the magic

y 现在是:

array([1.5,0.66666667,0.16666667])

因此与乘法相同:(注意顺序已更改)

np.array([3,2,1])

带权重:

np.array([0.5,0.3333333333333333,0.16666666666666666])

唯一的问题是,x 必须重新排序,因为 argsort 表示值的顺序,而不是值的顺序,同时保持原始值的顺序。

其他解决方案可以使用 np.fromfunction() 或 np.vectorize() 来调用向量上的回调(我需要知道值的索引来执行诸如 3-index 之类的操作以获得目标权重)但对于我的大脑现在更容易理解列表。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。