本文整理汇总了Golang中github.com/huichen/mlf/util.Matrix.IsSparse方法的典型用法代码示例。如果您正苦于以下问题:Golang Matrix.IsSparse方法的具体用法?Golang Matrix.IsSparse怎么用?Golang Matrix.IsSparse使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/huichen/mlf/util.Matrix
的用法示例。
在下文中一共展示了Matrix.IsSparse方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: GetDeltaX
// 输入x_k和g_k,返回x需要更新的增量 d_k = - H_k * g_k
func (opt *lbfgsOptimizer) GetDeltaX(x, g *util.Matrix) *util.Matrix {
if x.NumLabels() != g.NumLabels() {
log.Fatal("x和g的维度不一致")
}
// 第一次调用时开辟内存
if opt.k == 0 {
if x.IsSparse() {
opt.initStruct(x.NumLabels(), 0, x.IsSparse())
} else {
opt.initStruct(x.NumLabels(), x.NumValues(), x.IsSparse())
}
}
currIndex := util.Mod(opt.k, *lbfgs_history_size)
// 更新x_k
opt.x[currIndex].DeepCopy(x)
// 更新g_k
opt.g[currIndex].DeepCopy(g)
// 当为第0步时,使用简单的gradient descent
if opt.k == 0 {
opt.k++
return g.Opposite()
}
prevIndex := util.Mod(opt.k-1, *lbfgs_history_size)
// 更新s_(k-1)
opt.s[prevIndex].WeightedSum(opt.x[currIndex], opt.x[prevIndex], 1, -1)
// 更新y_(k-1)
opt.y[prevIndex].WeightedSum(opt.g[currIndex], opt.g[prevIndex], 1, -1)
// 更新ro_(k-1)
opt.ro.Set(prevIndex, 1.0/util.MatrixDotProduct(opt.y[prevIndex], opt.s[prevIndex]))
// 计算两个循环的下限
lowerBound := opt.k - *lbfgs_history_size
if lowerBound < 0 {
lowerBound = 0
}
// 第一个循环
opt.q.DeepCopy(g)
for i := opt.k - 1; i >= lowerBound; i-- {
currIndex := util.Mod(i, *lbfgs_history_size)
opt.alpha.Set(currIndex,
opt.ro.Get(currIndex)*util.MatrixDotProduct(opt.s[currIndex], opt.q))
opt.q.Increment(opt.y[currIndex], -opt.alpha.Get(currIndex))
}
// 第二个循环
opt.z.DeepCopy(opt.q)
for i := lowerBound; i <= opt.k-1; i++ {
currIndex := util.Mod(i, *lbfgs_history_size)
opt.beta.Set(currIndex,
opt.ro.Get(currIndex)*util.MatrixDotProduct(opt.y[currIndex], opt.z))
opt.z.Increment(opt.s[currIndex],
opt.alpha.Get(currIndex)-opt.beta.Get(currIndex))
}
// 更新k
opt.k++
return opt.z.Opposite()
}