我有一个非常大的吸收马尔可夫链(扩展到问题大小 - 从10个状态到数百万个)非常稀疏(大多数状态只能对4或5个其他状态作出反应).
我需要计算该链的基本矩阵的一行(给定一个起始状态的每个状态的平均频率).
通常,我会通过计算来做到这一点(I - Q)^(-1),但我找不到一个实现稀疏矩阵逆算法的好库!我已经看过几篇论文,其中大部分都是博士级的工作.
我的大部分Google结果都指向了一些帖子,讨论在解决线性(或非线性)方程组时如何不应该使用矩阵逆...我觉得这没有特别有用.基本矩阵的计算是否类似于求解方程组,我根本不知道如何以另一个的形式表达一个?
所以,我提出两个具体问题:
计算稀疏矩阵的逆的行(或所有行)的最佳方法是什么?
要么
计算大吸收马尔可夫链基本矩阵的最佳方法是什么?
一个Python解决方案会很精彩(因为我的项目目前仍然是一个概念验证),但是如果我不得不用一些好的'Fortran或C弄脏,那不是问题.
编辑:我刚刚意识到矩阵A的逆B可以定义为AB = I,其中I是单位矩阵.这可能会允许我使用一些标准的稀疏矩阵解算器来计算逆...我得赶紧走了,可以随意完成我的思路,我刚开始想可能只需要一个非常基本的矩阵属性...
这个Keras模型似乎需要使用Tensorflow后端的6GB + RAM.我的背后数学建议存储权重不应超过500MB.这是怎么回事?
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout, Flatten
from keras.layers.convolutional import Convolution2D, MaxPooling2D
IMAGE_SIZE = 128
print('Build model...')
model = Sequential()
# three color channels, 128x128
# 16 con filters, 3 rows, 3 columns
model.add(Convolution2D(16, 3, 3, input_shape=(3, IMAGE_SIZE, IMAGE_SIZE)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(1))
model.add(Dense(3 * IMAGE_SIZE * IMAGE_SIZE))
model.compile(loss='mse', optimizer='sgd')
Run Code Online (Sandbox Code Playgroud)
它是一个连接到单个神经元的卷积层(16个3x3滤波器),然后该单个神经元连接到~50k神经元.
我对Keras很新,所以我想我的误解是非常基本的,但我似乎无法弄明白.
我的MapReduce工作完成后,我得到了很多Counter信息:
File System Counters
FILE: Number of bytes read=4386096368
FILE: Number of bytes written=8805370803
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=54583718086
HDFS: Number of bytes written=4382090874
HDFS: Number of read operations=1479
HDFS: Number of large read operations=0
HDFS: Number of write operations=2
Job Counters
Launched map tasks=369
Launched reduce tasks=1
Data-local map tasks=369
Total time spent by all maps in occupied slots …Run Code Online (Sandbox Code Playgroud) 最近,我想分配一个u64与 128 字节边界对齐的 s 向量,以便我可以使用 AVX512F 函数。我第一次将函数复制Vec<u64>到对齐的Vec<u64>:
fn copy_to_aligned(inp: Vec<u64>) -> Vec<u64> {
// note: when the returned vec is freed, the alignment / layout information
// will be lost. The internal memory will be freed using the alignment
// of a u64.
let aligned_layout = Layout::from_size_align(inp.len() * size_of::<u64>(), 128)
.unwrap();
let new_vec = unsafe {
let new_vec_mem = alloc_zeroed(aligned_layout) as *mut u64;
copy_nonoverlapping(inp.as_ptr(), new_vec_mem, inp.len());
Vec::from_raw_parts(new_vec_mem, inp.len(), inp.len())
};
return new_vec;
}
Run Code Online (Sandbox Code Playgroud)
我现在意识到这段代码是错误的:虽然新向量是使用对齐的内存和适当的内容创建的,但当新向量被删除时, …
我刚刚开始进入C++(我是一个经验丰富的Python/Java开发人员进入OpenCL的更好部分),我对如何将对象传递给函数感到困惑.
假设我有一个简单的类:
class Thing {
int var;
int var2;
int var3;
void doSomething();
};
Run Code Online (Sandbox Code Playgroud)
现在,这个类的"大小"至少是3*sizeof(int)(我不确定是否存储了函数指针).现在说我有两个功能签名:
void doThing1(Thing t);
void doThing2(Thing* t);
Run Code Online (Sandbox Code Playgroud)
当我调用时doThing1,是否会将整个实例复制到堆栈中?当我打电话时doThing2,它只需要sizeof(Thing*)堆栈空间吗?
互联网上的许多"传统智慧"一直在告诉我尝试使用功能签名doThing1,但乍一看似乎非常愚蠢 - 如果它确实复制了整个对象.
我还假设如果一个函数要修改堆上的对象(使用new关键字创建),它应该看起来像doThing1.
请纠正我的无知.要么我的Google搜索没有帮助,要么Google没有帮助.
在Python中是否有任何与Haskelluntil函数相同的内置函数?
从本质上讲,until应用一个函数f来提供一个初始值v,然后应用f到f(v),直到满足条件.换句话说,until返回重复应用的结果f直到条件成立.
我可以在Python中实现这一点,如下所示:
def until(cond, func, starting):
val = starting
while not cond(val):
val = func(val)
return val
Run Code Online (Sandbox Code Playgroud)
我应该使用这个实现,还是应该使用一些库函数?