我想在 numpy 中生成一个 5 级 100x600 矩阵,其中所有条目均从 np.random.uniform(0, 20) 采样,以便所有条目将均匀分布在 [0, 20) 之间。在 python 中这样做的最佳方法是什么?
我看到这里有一种受 SVD 启发的方法(https://math.stackexchange.com/questions/3567510/how-to-generate-a-rank-r-matrix-with-entries-uniform),但是我不知道如何编码。我正在寻找这种 SVD 启发方式的工作示例来获取均匀分布的条目。
实际上,我已经通过垂直堆叠五个 20x100 1 阶矩阵,然后打乱垂直索引,成功地编码了 5 阶 100x100 矩阵。然而,生成的 100x100 矩阵没有均匀分布的条目 [0, 20)。
这是我的代码(我最好的尝试):
import numpy as np
def randomMatrix(m, n, p, q):
# creates an m x n matrix with lower bound p and upper bound q, randomly.
count = np.random.uniform(p, q, size=(m, n))
return count
Qs = []
my_rank = 5
for i in range(my_rank):
L …
Run Code Online (Sandbox Code Playgroud) 我在处理排名不足的情况时非常依赖该qr()
函数,但最近遇到了一些它无法正常工作的示例。考虑下面的矩阵badX
:
badX <-
structure(c(-1.641906809157e-10, 0, 0, 0, 0, -0.5, 0, 0, -1.10482935525559e-16,
0, -3.06266685765538e-17, 0, -4.83736007092039e-17, 0, -3.14414492582296e-18,
-3.06158275836099e-18), dim = c(4L, 4L), dimnames = list(c("(Intercept)",
"A2", "A3", "B2"), NULL))
Run Code Online (Sandbox Code Playgroud)
我们不能使用以下方法反转该矩阵solve()
:
solve(badX)
## Error in solve.default(badX): system is computationally singular: reciprocal condition number = 5.55308e-18
Run Code Online (Sandbox Code Playgroud)
然而qr()
,其相关例程认为该矩阵的秩为 4,并且可以对其求逆:
qr(badX)$rank
## [1] 4
qr.solve(badX)
## [,1] [,2] [,3] [,4]
## [1,] -6090479645 0 2.197085e+10 7.366741e+10
## [2,] 0 -2 0.000000e+00 0.000000e+00
## [3,] 0 …
Run Code Online (Sandbox Code Playgroud) 给定L
和U
LU分解和常量向量b
这样LU*x=b
,是否有任何内置函数可以找到x
?意思是这样的 -
X = functionName(L,U,b)
Run Code Online (Sandbox Code Playgroud)
注意在这两个L
和U
我们面对的是可直接要解决三角矩阵向前和向后的替换,而无需使用高斯消元过程.
编辑:
解决这个线性方程系统应该按照以下步骤 -
1. define y - s.t Ux=y
2. solve Ly=b by forward substitution
3. solve Ux=y by backward substitution
4. return y
Run Code Online (Sandbox Code Playgroud)
编辑2:
我发现linalg :: matlinsolveLU 但我没有尝试它因为我的版本太旧(R2010a
).它适合任何人吗?
matlab linear-algebra matrix-decomposition matrix-factorization
我不明白如何使用chol
R中的函数来计算正半正定矩阵.(或者我这样做,并且有一个错误.)文档说明:
如果pivot = TRUE,则可以计算正半正定x的Choleski分解.x的等级作为attr(Q,"rank")返回,受数字误差的影响.枢轴以attr(Q,"pivot")返回.不再是t(Q)%*%Q等于x的情况.但是,设置pivot < - attr(Q,"pivot")和oo < - order(pivot),t(Q [,oo])%*%Q [,oo]等于x ...
以下示例似乎与此描述相符.
> x <- matrix(1, nrow=3, ncol=3)
> Q <- chol(x, pivot=TRUE)
> oo <- order(attr(Q, 'pivot'))
> t(Q[, oo]) %*% Q[, oo]
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 1 1 1
[3,] 1 1 3
Run Code Online (Sandbox Code Playgroud)
结果不是x
.我错误地使用了枢轴吗?
我已经问了类似的东西,但这次我会更具体.
我需要在for
循环内执行通常大的正定对称矩阵(约1000x1000
)的Cholesky分解.现在,要做到这一点,我一直试图:
1)Apache Math库
2)并行Colt库
3)JLapack库
在上述三种情况中的任何一种情况下,例如,与MATLAB相比,时间消耗非常长.
因此,我想知道在Java中是否存在用于Cholesky分解的高度优化的外部工具:例如,我一直在考虑CHOLMOD算法,其实际上是内部调用的MATLAB
和其他工具.
我真的很感激能够对此事进行全面的反馈.
我正在研究一个数字代码,并希望评估该代码用例的稀疏和密集矩阵-LU分解(以及以后的分解)如何不同。Eigens密集分解对象可以是可复制的,并且可以使用boost :: variant缓存这些对象,以在以后获得更大的灵活性。
我想用稀疏解算器实现相同的目标,但是这样做有困难。下面的最小示例应说明我的方法。
问题是,为什么稀疏求解器不可复制?我可以只编写自己的复制操作,还是确定格式不正确。我该如何解决这个问题?
谢谢 :)
/// -------------------------------- DENSE APPROACH, WORKS -------------------------------
using CacheType = boost::variant<Eigen::FullPivLU<Eigen::MatrixXd>,
Eigen::PartialPivLU<Eigen::MatrixXd>>;
// visit the variant, and solve with the correct decomposition
struct DenseVisitor : boost::static_visitor<Eigen::MatrixXd> {
DenseVisitor(Eigen::MatrixXd const& r) : rhs{r} {}
template <class Decomposition>
Eigen::MatrixXd operator()(Decomposition const& d) const
{
Eigen::MatrixXd res = d.solve(rhs);
return res;
}
private:
Eigen::MatrixXd const& rhs; // reference to rhs, since () will take only one argument
};
// part of a class, having a cachetype as …
Run Code Online (Sandbox Code Playgroud) 我想对最好的 2 或 3 个库进行基准测试,以计算截断奇异值分解 (SVD),即仅保留 k 个最大奇异值的 SVD。此外,我还有这些限制:
我遇到过相当多的库,但例如,对于 Colt,我什至不知道 SVD 算法是否考虑到我的矩阵稀疏的事实。另外,我没有找到一个可以直接计算截断解决方案的库(这应该要快得多)。实际上,我最感兴趣的是从截断的 SVD 获得的近似矩阵。
预先感谢您的帮助,
罗曼·拉罗什
我正在尝试使用我的 lu 分解,主要基于带有部分旋转 Matlab 的 LU 分解
function [L,U,P] = lup(A)
n = length(A);
L = eye(n);
U = zeros(n);
P = eye(n);
for k=1:n-1
% find the entry in the left column with the largest abs value (pivot)
[~,r] = max(abs(A(k:end,k)));
r = n-(n-k+1)+r;
A([k r],:) = A([r k],:);
P([k r],:) = P([r k],:);
L([k r],:) = L([r k],:);
% from the pivot down divide by the pivot
L(k+1:n,k) = A(k+1:n,k) / A(k,k);
U(k,1:n) = A(k,1:n);
A(k+1:n,1:n) = …
Run Code Online (Sandbox Code Playgroud) 我在Math Stackexchange中问过这个问题,但似乎没有得到足够的关注,所以我在这里问它.https://math.stackexchange.com/questions/1729946/why-do-we-say-svd-can-handle-singular-matrx-when-doing-least-square-comparison?noredirect=1#comment3530971_1729946
我从一些教程中了解到,当解决最小二乘问题时,SVD应该比QR分解更稳定,并且它能够处理奇异矩阵.但是我在matlab中编写的以下示例似乎支持相反的结论.我对SVD没有深刻的理解,所以如果您可以在Math StackExchange的旧帖子中查看我的问题并向我解释,我会非常感激.
我使用具有大条件数(e + 13)的矩阵.结果显示SVD得到比QR(e-27)大得多的误差(0.8)
% we do a linear regression between Y and X
data= [
47.667483331 -122.1070832;
47.667483331001 -122.1070832
];
X = data(:,1);
Y = data(:,2);
X_1 = [ones(length(X),1),X];
%%
%SVD method
[U,D,V] = svd(X_1,'econ');
beta_svd = V*diag(1./diag(D))*U'*Y;
%% QR method(here one can also use "\" operator, which will get the same result as I tested. I just wrote down backward substitution to educate myself)
[Q,R] = qr(X_1)
%now do backward substitution
[nr nc] = …
Run Code Online (Sandbox Code Playgroud) matlab svd least-squares qr-decomposition matrix-decomposition
我试图使用chol()
函数在R中获得下面矩阵的下三角Cholesky分解.然而,它继续返回上三角分解,我似乎无法找到一种方法来获得下三角分解,即使在查看文档之后.以下是我使用的代码 -
x <- matrix(c(4,2,-2, 2,10,2, -2,2,5), ncol = 3, nrow = 3)
Q <- chol(x)
Q
# [,1] [,2] [,3]
# [1,] 2 1 -1.000000
# [2,] 0 3 1.000000
# [3,] 0 0 1.732051
Run Code Online (Sandbox Code Playgroud)
基本上,我需要找到矩阵Q
这样QQ' = X
.谢谢你的帮助!