如果我有一个1000×1,000的方阵,那么Lapack可以计算出这个矩阵的特征向量和特征值吗?如果可以花多长时间?那么10000×10,000矩阵甚至1,000,000乘1,000,000矩阵呢?
请注意,这些将是主要由0填充的稀疏矩阵(矩阵将是代表社交网络的图形).Lapack中是否有处理稀疏矩阵的特殊程序?我看到了Arpack的建议.但是这可以计算非常大的矩阵吗?
princomp()在R中使用函数时,遇到以下错误:"covariance matrix is not non-negative definite".
我认为,这是由于协方差矩阵中的某些值为零(实际上接近零,但在舍入期间变为零).
当协方差矩阵包含零时,是否有解决方法可以继续使用PCA?
[仅供参考:获得协方差矩阵是princomp()通话中的一个中间步骤.重现此错误的数据文件可以从这里下载 - http://tinyurl.com/6rtxrc3]
在尝试并行计算几个矩阵的特征值和特征向量时,我发现LAPACK dsyevr函数似乎不是线程安全的.
这是C中的一个最小代码示例,它演示了这个问题:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <assert.h>
#include <omp.h>
#include "lapacke.h"
#define M 8 /* number of matrices to be diagonalized */
#define N 1000 /* size of each matrix (real, symmetric) */
typedef double vec_t[N]; /* type for length N vector */
typedef double mtx_t[N][N]; /* type for N x N matrices */
void
init(int m, int n, mtx_t *A){
/* init m symmetric n x x matrices …Run Code Online (Sandbox Code Playgroud) 我有一个矩阵,例如这个例子(我的实际矩阵可以大得多)
A = [-1 -2 -0.5;
0 0.5 0;
0 0 -1];
Run Code Online (Sandbox Code Playgroud)
只有两个线性无关的特征值(重复特征值-1).我想用广义特征向量获得完整的基础.我知道如何做到这一点的一种方法是使用Matlab jordan在Symbolic Math工具箱中的功能,但我更喜欢为数字输入设计的东西(实际上,有两个输出,jordan大型矩阵失败:"MuPAD命令出错:相似矩阵太大").我不需要Jordan规范形式,这在数字上下文中是非常不稳定的,只是一个广义特征向量的矩阵.是否有函数或函数组合以数字稳定的方式自动执行此操作,或者必须使用通用的手动方法(这样的过程有多稳定)?
注意:通过"广义特征向量",我指的是一个非零向量,可用于增加所谓的有缺陷矩阵的不完全基础.我并不是指使用或通过解决广义特征值问题而得到的特征值的特征向量(尽管后一种用法很常见,但我认为最好避免使用).除非有人能纠正我,否则我不相信这两者是一样的.eigqz
更新1 - 五个月后:
请参阅我的答案,了解如何为大于82乘82的矩阵(本问题中的测试矩阵的极限)符号化地获取广义特征向量.
我仍然对数字方案感兴趣(或者如果这些方案都与计算Jordan形式有关,那么这些方案可能会如何不稳定).我不希望盲目地实现已被标记为此问题的副本的线性代数101方法,因为它不是数值算法,而是用于评估学生的铅笔和纸张方法(我认为它可以实现但象征性地).如果有人能指出我对该方案的实施或对其进行数值分析,我会对此感兴趣.
更新2 - 2015年2月:在R2014b中测试的所有上述内容仍然是正确的.
背景
这是来自电子歌曲的歌曲剪辑视频。在视频的开头,歌曲全速播放。当您放慢歌曲速度时,您可以听到歌曲使用的所有独特声音。其中一些声音重复。
问题描述
我想要做的是创建一个像下面这样的视觉效果,其中为每个独特的声音创建一个水平轨道/行,该轨道上有一个彩色块,对应于声音播放的歌曲中的每个时间帧。音轨/行应按声音与每个音轨的相似程度排序,越相似的声音越靠近。如果声音完全相同,以至于人类无法区分它们,那么它们应该被视为相同的声音。
例如,如果下面的 5 个波中的每一个都代表声音产生的声波,则这些声音中的每一个都将被视为相似,并且将在网格上垂直放置在一起。
尝试
我一直在看一个例子拉普拉斯分割在librosa。标记为结构组件的图形看起来可能正是我所需要的。从阅读论文来看,他们似乎试图将歌曲分解为合唱、诗歌、桥段等片段……但我实际上是在尝试将歌曲分解为 1 或 2 个节拍片段。
这是拉普拉斯分割的代码(如果您愿意,也可以使用Jupyter Notebook)。
# -*- coding: utf-8 -*-
"""
======================
Laplacian segmentation
======================
This notebook implements the laplacian segmentation method of
`McFee and Ellis, 2014 <http://bmcfee.github.io/papers/ismir2014_spectral.pdf>`_,
with a couple of minor stability improvements.
Throughout the example, we will refer to equations in the paper by number, so it will be
helpful …Run Code Online (Sandbox Code Playgroud)我正在寻找或构建两个矩阵之间的公共特征向量矩阵 X A,B例如:
AX=aX with "a" the diagonal matrix corresponding to the eigenvalues
BX=bX with "b" the diagonal matrix corresponding to the eigenvalues
Run Code Online (Sandbox Code Playgroud)
其中A和B是方阵和可对角化矩阵。
我查看了类似的帖子,但没有得出结论,即当我构建F由以下定义的最终想要的内同态时得到有效结果:F = P D P^-1
我还阅读了维基百科主题和这篇有趣的论文,但不必提取非常容易实现的方法。
特别是,我对eig(A,B)Matlab 函数很感兴趣。
我试着像这样使用它:
% Search for common build eigen vectors between FISH_sp and FISH_xc
[V,D] = eig(FISH_sp,FISH_xc);
% Diagonalize the matrix (A B^-1) to compute Lambda since we have AX=Lambda B X …Run Code Online (Sandbox Code Playgroud) 这里有两个关于方阵的特征向量和特征值的假设。我相信两者都是正确的:
如果一个矩阵是对称的并且只包含实数,那么它就是一个厄米矩阵,那么所有的特征值都应该是实数,所有特征向量的所有分量也应该是实数。当您从 Hermitian 矩阵计算特征向量和特征值时,结果中不应出现复数。
从给定矩阵计算的给定特征值的特征向量应始终指向仅由矩阵和特征值确定的方向。用于计算它的算法对结果没有影响,只要正确执行算法即可。
但是,当您在 Python 中使用标准库来计算特征向量和特征值时,这两个假设都不成立。这些方法是否包含错误?
有四种不同的方法可以从 Hermitian 矩阵计算特征值和特征向量:
#1 和 #2 可用于任何方阵(包括 Hermitian 矩阵)。
#3 和 #4 仅用于 Hermitian 矩阵。据我所知,他们的目的只是为了让他们跑得更快,但结果应该是一样的(只要输入真的是 Hermitian)。
但是对于相同的输入,这四种方法会产生三种不同的结果。这是我用来测试所有四种方法的程序:
#!/usr/bin/env python3
import numpy as np
import scipy.linalg as la
A = [
[19, -1, -1, -1, -1, -1, -1, -1],
[-1, 19, -1, -1, -1, -1, -1, -1],
[-1, -1, 19, -1, -1, -1, -1, -1],
[-1, -1, -1, 19, -1, -1, -1, -1],
[-1, -1, -1, -1, 19, -1, …Run Code Online (Sandbox Code Playgroud) 我的问题的简短版本:
A如果我们已经知道属于特征向量的特征值,那么计算矩阵的特征向量的最佳方法是什么?
更长的解释:
我有一个大的随机矩阵A,因为它是随机的,有一个非负的左特征向量x(这样A^Tx=x).
我正在寻找快速有效的数值计算这个向量的方法.(最好是在MATLAB或numpy/scipy中 - 因为这两者都包含在ARPACK/LAPACK中,任何一个都没问题).
我知道这1是最大的特征值A,所以我知道调用类似这样的Python代码:
from scipy.sparse.linalg import eigs
vals, vecs = eigs(A, k=1)
Run Code Online (Sandbox Code Playgroud)
将导致vals = 1并vecs等于我需要的向量.
然而,困扰我的是,计算特征值通常比解决线性系统更困难,并且通常,如果矩阵M具有特征值l,那么找到适当的特征向量就是求解方程的问题.(M - 1 * I) * x = 0至少在理论上,这是一种比计算特征值更简单的操作,因为我们只求解线性系统,更具体地说,找到矩阵的零空间.
但是,我发现所有的零空间计算方法都MATLAB依赖于svd计算,这是我无法在我的大小矩阵上执行的过程.我也不能在线性方程上调用求解器,因为它们都只找到一个解决方案,而那个解决方案是0(这是一个解决方案,但不是我需要的解决方案).
有没有办法避免调用eigs类似函数来比通过计算最大特征值和伴随的特征向量更快地解决我的问题?
我创建了一个任意的2x2矩阵:
In [87]: mymat = np.matrix([[2,4],[5,3]])
In [88]: mymat
Out[88]:
matrix([[2, 4],
[5, 3]])
Run Code Online (Sandbox Code Playgroud)
我尝试使用numpy.linalg.eig计算特征向量:
In [91]: np.linalg.eig(mymat)
Out[91]:
(array([-2., 7.]),
matrix([[-0.70710678, -0.62469505],
[ 0.70710678, -0.78086881]]))
In [92]: eigvec = np.linalg.eig(mymat)[1][0].T
In [93]: eigvec
Out[93]:
matrix([[-0.70710678],
[-0.62469505]])
Run Code Online (Sandbox Code Playgroud)
我将我的一个特征向量乘以我的矩阵,期望结果是一个向量,它是我的特征向量的标量倍数.
In [94]: mymat * eigvec
Out[94]:
matrix([[-3.91299375],
[-5.40961905]])
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.任何人都可以向我解释这里出了什么问题吗?