- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试拟合部分由对称矩阵 A
参数化的 Theano 模型。为了加强 A
的对称性,我希望能够通过仅传入上三角中的值来构造 A
。
等效的 numpy 代码可能如下所示:
import numpy as np
def make_symmetric(p, n):
A = np.empty((n, n), P.dtype)
A[np.triu_indices(n)] = p
A.T[np.triu_indices(n)] = p
# output matrix will be (n, n)
n = 4
# parameter vector
P = np.arange(n * (n + 1) / 2)
print make_symmetric(P, n)
# [[ 0. 1. 2. 3.]
# [ 1. 4. 5. 6.]
# [ 2. 5. 7. 8.]
# [ 3. 6. 8. 9.]]
但是,由于符号张量变量不支持项目分配,我正在努力寻找一种在 Theano 中执行此操作的方法。
我能找到的最接近的东西是 theano.tensor.diag
,它允许我从它的对角线构造一个符号矩阵:
import theano
from theano import tensor as te
P = te.dvector('P')
D = te.diag(P)
get_D = theano.function([P], D)
print get_D(np.arange(1, 5))
# [[ 1. 0. 0. 0.]
# [ 0. 2. 0. 0.]
# [ 0. 0. 3. 0.]
# [ 0. 0. 0. 4.]]
虽然还有一个 theano.tensor.triu
函数,但它不能用于从上三角构造矩阵,而是返回下三角元素为零的数组副本。
有什么方法可以从其上三角构建 Theano 符号矩阵吗?
最佳答案
您可以使用 theano.tensor.triu
并将结果添加到其转置,然后减去对角线。
复制+粘贴代码:
import numpy as np
import theano
import theano.tensor as T
theano.config.floatX = 'float32'
mat = T.fmatrix()
sym1 = T.triu(mat) + T.triu(mat).T
diag = T.diag(T.diagonal(mat))
sym2 = sym1 - diag
f_sym1 = theano.function([mat], sym1)
f_sym2 = theano.function([mat], sym2)
m = np.arange(9).reshape(3, 3).astype(np.float32)
print m
# [[ 0. 1. 2.]
# [ 3. 4. 5.]
# [ 6. 7. 8.]]
print f_sym1(m)
# [[ 0. 1. 2.]
# [ 1. 8. 5.]
# [ 2. 5. 16.]]
print f_sym2(m)
# [[ 0. 1. 2.]
# [ 1. 4. 5.]
# [ 2. 5. 8.]]
这有帮助吗?这种方法需要传递一个完整的矩阵,但会忽略对角线下方的所有内容并使用上三角形进行对称。
我们还可以看看这个函数的导数。为了不处理多维输出,我们可以例如查看矩阵项之和的梯度
sum_grad = T.grad(cost=sym2.sum(), wrt=mat)
f_sum_grad = theano.function([mat], sum_grad)
print f_sum_grad(m)
# [[ 1. 2. 2.]
# [ 0. 1. 2.]
# [ 0. 0. 1.]]
这反射(reflect)了上三角项在总和中的两倍。
更新:您可以进行正常的索引:
n = 4
num_triu_entries = n * (n + 1) / 2
triu_index_matrix = np.zeros([n, n], dtype=int)
triu_index_matrix[np.triu_indices(n)] = np.arange(num_triu_entries)
triu_index_matrix[np.triu_indices(n)[::-1]] = np.arange(num_triu_entries)
triu_vec = T.fvector()
triu_mat = triu_vec[triu_index_matrix]
f_triu_mat = theano.function([triu_vec], triu_mat)
print f_triu_mat(np.arange(1, num_triu_entries + 1).astype(np.float32))
# [[ 1. 2. 3. 4.]
# [ 2. 5. 6. 7.]
# [ 3. 6. 8. 9.]
# [ 4. 7. 9. 10.]]
更新:要动态地完成所有这些,一种方法是编写 triu_index_matrix
的符号版本。这可以通过对 arange
进行一些改组来完成。但可能我过于复杂了。
n = T.iscalar()
n_triu_entries = (n * (n + 1)) / 2
r = T.arange(n)
tmp_mat = r[np.newaxis, :] + (n_triu_entries - n - (r * (r + 1)) / 2)[::-1, np.newaxis]
triu_index_matrix = T.triu(tmp_mat) + T.triu(tmp_mat).T - T.diag(T.diagonal(tmp_mat))
triu_vec = T.fvector()
sym_matrix = triu_vec[triu_index_matrix]
f_triu_index_matrix = theano.function([n], triu_index_matrix)
f_dynamic_sym_matrix = theano.function([triu_vec, n], sym_matrix)
print f_triu_index_matrix(5)
# [[ 0 1 2 3 4]
# [ 1 5 6 7 8]
# [ 2 6 9 10 11]
# [ 3 7 10 12 13]
# [ 4 8 11 13 14]]
print f_dynamic_sym_matrix(np.arange(1., 16.).astype(np.float32), 5)
# [[ 1. 2. 3. 4. 5.]
# [ 2. 6. 7. 8. 9.]
# [ 3. 7. 10. 11. 12.]
# [ 4. 8. 11. 13. 14.]
# [ 5. 9. 12. 14. 15.]]
关于python - 从其上三角初始化一个对称的 Theano dmatrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25326462/
我使用 Scikit-Learn Python API 在 Python 中训练了一个 xgboost 模型,并使用 pickle 对其进行了序列化。图书馆。我将模型上传到 ML Engine,但是当
我的理解是 DMatrix 接受 numpy.ndarray 作为输入。我已经尝试过多次,但它不允许我创建 DMatrix。 我尝试过使用 Xgboost.DMatrix 和 Xgboost.skle
我试图理解以下情况: 当我创建新的 xgbost DMatrix 时 xgX = xgb.DMatrix(X, label=Y, missing=np.nan) 基于具有 64 个特征的输入数据 X
我正在尝试拟合部分由对称矩阵 A 参数化的 Theano 模型。为了加强 A 的对称性,我希望能够通过仅传入上三角中的值来构造 A。 等效的 numpy 代码可能如下所示: import numpy
我正在尝试使用插入符号库调整 xgboost 的超参数来解决分类问题,由于我的数据集中有很多因素,并且 xgboost 喜欢将数据作为数字,所以我使用特征哈希创建了一个虚拟行,但是当我得到运行插入符列
我在 R 中使用 XGBoost 时遇到问题。我正在读取包含我的数据的 CSV 文件: get_data = function() { #Loading Data path = "dados_eye.
我提取了一些在 kaggle (linux) 上运行的 ML 代码,并尝试在 Windows 机器上的 jupyter notebook 中运行它。这是代码(其中的一部分): ##### RUN XG
在 xgboost 中可以设置参数 weight对于 DMatrix .这显然是一个权重列表,其中每个值都是相应样本的权重。 我找不到有关这些权重如何在梯度提升过程中实际使用的任何信息。他们是否与 e
我正在阅读the documentation for XGBoost ,特别是创建 CSR/CSC 格式的 DMatrix。该文档不是很有帮助: To load sparse matrix in CS
从python中的数据创建DMatrix时出现以下错误。 TypeError: can not initialize DMatrix from DataFrame Exception Attribut
我尝试了所有可能的解决方案,但仍然收到此错误,已经安装了所有依赖库。 import numpy as np import pandas as pd from sklearn.model_selecti
我正在尝试在数据集 X-train, X_test 上训练 xgboost 模型。代码: xgb_params = { "objective": "multi:softmax", "e
假设我有一个大数据框和一些列列表,我希望能够将它们放入 patsy dmatricies 中,而不必单独写出每个名称。也就是说,我想将列表中的名称称为列名称列表以形成术语。而不是在我的数据框列中写出每
在 xgboost 中,我正在做类似的事情 import numpy as np import xgboost as xgb y = np.arange(10) X = np.arange(20).r
我想在 C++ 项目中使用 xgboost 进行图像分类。我有特征矩阵 (hist) cv::Mat_ 和标签 vector std::vector,如何在 C++ 中创建 xgboost::DMat
只是想知道下一个案例怎么可能: def fit(self, train, target): xgtrain = xgb.DMatrix(train, label=target, missi
这个问题真的很奇怪,因为那部分与其他数据集工作得很好。 完整代码: import numpy as np import pandas as pd import xgboost as xgb from
我想检查 DMatrix目的。 documentation mentions获取行数和列数以及每行切片的方法: dmatrix.slice(index) 但我想使用 numpy 做更复杂的转换。有没有
我有点难以理解 weight 之间的区别。函数位于 xgb.DMatrix和 sum_pos_weight param 中的参数列表。我正在经历以下code它正在使用希格斯数据; 由于数据不平衡,作者
我正在改进一个旧应用程序,该应用程序广泛使用了 Numerical Recipes 的 dmatrix。由于我处理该应用程序的原因之一是因为它的代码即将打开,所以我想用可以自由分发的代码替换所有 Nu
我是一名优秀的程序员,十分优秀!