这个伟大的SO答案指向一个好的稀疏求解器Ax=b,但是我已经有了约束,x因此每个元素x都是>=0一个<=N.
此外,A是巨大的(约2e6x2e6),但<=4每行元素非常稀疏.
有什么想法/建议吗?我正在寻找像MATLAB这样的东西,lsqlin但是有很大的稀疏矩阵.
我基本上试图解决稀疏矩阵上的大规模有界变量最小二乘问题:

编辑: 在CVX中:
cvx_begin
variable x(n)
minimize( norm(A*x-b) );
subject to
x <= N;
x >= 0;
cvx_end
Run Code Online (Sandbox Code Playgroud) 我试图在一个非常大的矩阵上做一些k-means聚类.
矩阵大约是500000行×4000个cols但非常稀疏(每行只有几个"1"值).
整件事不适合内存,因此我将其转换为稀疏的ARFF文件.但是R显然无法读取稀疏的ARFF文件格式.我还将数据作为普通的CSV文件.
R中是否有可用于有效加载此类稀疏矩阵的包?然后,我将使用群集包中的常规k-means算法继续.
非常感谢
当使用具有因子的公式时,拟合模型将系数命名为XY,其中X是因子的名称,Y是其特定级别.我希望能够从这些系数的名称创建一个公式.
原因是:如果我将套索适合稀疏设计矩阵(如下所示),我想创建一个新的公式对象,它只包含非零系数的项.
require("MatrixModels")
require("glmnet")
set.seed(1)
n <- 200
Z <- data.frame(letter=factor(sample(letters,n,replace=T),letters),
x=sample(1:20,200,replace=T))
f <- ~ letter + x:letter + I(x>5):letter
X <- sparse.model.matrix(f, Z)
beta <- matrix(rnorm(dim(X)[2],0,5),dim(X)[2],1)
y <- X %*% beta + rnorm(n)
myfit <- glmnet(X,as.vector(y),lambda=.05)
fnew <- rownames(myfit$beta)[which(myfit$beta != 0)]
[1] "letterb" "letterc" "lettere"
[4] "letterf" "letterg" "letterh"
[7] "letterj" "letterm" "lettern"
[10] "lettero" "letterp" "letterr"
[13] "letters" "lettert" "letteru"
[16] "letterw" "lettery" "letterz"
[19] "lettera:x" "letterb:x" "letterc:x"
[22] "letterd:x" "lettere:x" "letterf:x"
[25] "letterg:x" "letterh:x" "letteri:x"
[28] "letterj:x" …Run Code Online (Sandbox Code Playgroud) 我有一个scipy.sparse.csr_matrix格式的大型稀疏矩阵X,我想用一个利用并行性的numpy数组W来乘以它.经过一些研究后,我发现我需要在多处理中使用Array,以避免在进程之间复制X和W(例如:如何在Python多处理中将Pool.map与Array(共享内存)结合起来?并将共享的只读数据复制到Python多处理的不同过程?).这是我最近的尝试
import multiprocessing
import numpy
import scipy.sparse
import time
def initProcess(data, indices, indptr, shape, Warr, Wshp):
global XData
global XIndices
global XIntptr
global Xshape
XData = data
XIndices = indices
XIntptr = indptr
Xshape = shape
global WArray
global WShape
WArray = Warr
WShape = Wshp
def dot2(args):
rowInds, i = args
global XData
global XIndices
global XIntptr
global Xshape
data = numpy.frombuffer(XData, dtype=numpy.float)
indices = numpy.frombuffer(XIndices, dtype=numpy.int32)
indptr = numpy.frombuffer(XIntptr, dtype=numpy.int32)
Xr = scipy.sparse.csr_matrix((data, indices, …Run Code Online (Sandbox Code Playgroud) 我在我的mongodb集合上创建了一个稀疏且唯一的索引.
var Account = new Schema({
email: { type: String, index: {unique: true, sparse: true} },
....
Run Code Online (Sandbox Code Playgroud)
它已被正确创建:
{ "ns" : "MyDB.accounts", "key" : { "email" : 1 }, "name" : "email_1", "unique" : true, "sparse" : true, "background" : true, "safe" : null }
Run Code Online (Sandbox Code Playgroud)
但是,如果我插入第二个未设置密钥的文档,则会收到此错误:
{ [MongoError: E11000 duplicate key error index: MyDB.accounts.$email_1 dup key: { : null }]
name: 'MongoError',
err: 'E11000 duplicate key error index: MyDB.accounts.$email_1 dup key: { : null }',
code: 11000,
n: 0,
ok: …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,可以在多个段中写入大文件.我使用FileStream.Seek来定位每个wirte.看来,当我在稀疏文件中的深位置调用FileStream.Write时,write会在所有前面的字节上触发"回填"操作(写入0),这很慢.
有没有更有效的方法来处理这种情况?
以下代码演示了该问题.初始写入在我的机器上大约需要370 MS.
public void WriteToStream()
{
DateTime dt;
using (FileStream fs = File.Create("C:\\testfile.file"))
{
fs.SetLength(1024 * 1024 * 100);
fs.Seek(-1, SeekOrigin.End);
dt = DateTime.Now;
fs.WriteByte(255);
}
Console.WriteLine(@"WRITE MS: " + DateTime.Now.Subtract(dt).TotalMilliseconds.ToString());
}
Run Code Online (Sandbox Code Playgroud) 我想应用鼠标包,但我无法将大型稀疏矩阵转换为矩阵.
library(Matrix)
library(mice)
i=c(2,9,6:10^7)
j=c(2,9,6:10^7)
x=7*(1:7^7)
write.csv(a,"a.csv")
c=read.csv("a.csv")
w=sparseMatrix(i=c[,1],j=c[,2],x=c[,3])
w=as.matrix(w)
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)Error in asMethod(object) : Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105
当我执行以下代码时,我得到一个备用矩阵:
import numpy as np
from scipy.sparse import csr_matrix
row = np.array([0, 0, 1, 2, 2, 2])
col = np.array([0, 2, 2, 0, 1, 2])
data = np.array([1, 2, 3, 4, 5, 6])
sp = csr_matrix((data, (row, col)), shape=(3, 3))
print(sp)
(0, 0) 1
(0, 2) 2
(1, 2) 3
(2, 0) 4
(2, 1) 5
(2, 2) 6
Run Code Online (Sandbox Code Playgroud)
我想在这个稀疏矩阵中添加另一列,因此输出为:
(0, 0) 1
(0, 2) 2
(0, 3) 7
(1, 2) 3
(1, 3) 7
(2, 0) 4
(2, 1) …Run Code Online (Sandbox Code Playgroud) 我想以HDF5格式压缩和存储一个巨大的Scipy矩阵.我该怎么做呢?我试过以下代码:
a = csr_matrix((dat, (row, col)), shape=(947969, 36039))
f = h5py.File('foo.h5','w')
dset = f.create_dataset("init", data=a, dtype = int, compression='gzip')
Run Code Online (Sandbox Code Playgroud)
我得到这样的错误,
TypeError: Scalar datasets don't support chunk/filter options
IOError: Can't prepare for writing data (No appropriate function for conversion path)
Run Code Online (Sandbox Code Playgroud)
我无法将其转换为numpy数组,因为会有内存溢出.什么是最好的方法?
矩阵取幂可以使用scipy.linalg库中的函数在python中执行,即expm, expm2, expm3.expm利用Pade近似; expm2使用特征值分解方法,expm3并使用默认数量为20的泰勒级数.
在SciPy 0.13.0发行说明中声明:
不推荐使用矩阵指数函数scipy.linalg.expm2和scipy.linalg.expm3.所有用户都应该使用数字更强大的scipy.linalg.expm函数.
虽然expm2并expm3自发布版本SciPy的0.13.0已被弃用,我发现,在许多情况下,这些实现比快expm.由此,出现了一些问题:
在什么情况下expm2和expm3会导致数值不稳定?
在什么情况下(例如稀疏矩阵,对称,......)每个算法更快/更精确?