在MATLAB中,当我运行[V,D] = eig(a)对称矩阵的命令时,最大特征值(及其相关向量)位于最后一列.但是,当我使用非对称矩阵运行它时,最大的特征值在第一列中.
我正在尝试计算特征向量中心性,这要求我将计算与最大特征值相关联的特征向量.因此,最大的特征值出现在两个不同的位置这一事实使我很难找到解决方案.
eigenvalues, eigenvectors = linalg.eig(K)
Run Code Online (Sandbox Code Playgroud)
我怎样才能打印出特征向量len(K).所以,如果有K2x2矩阵,我得到4个特征向量,如果有len(K)=2.... 我怎么能打印其中2个...
非常感谢
我在Matlab和Numpy中计算特征向量,但得到不同的结果.我的印象是给定矩阵只有一组特征向量,但这两个输出看起来都是有效的.
这是我的matlab代码:
m = [ 1.4675 + 0.0000i 0.1669 + 1.2654i;
0.1669 - 1.2654i 1.3085 + 0.0000i]
[eig_vec,eig_val] = eig(m)
Run Code Online (Sandbox Code Playgroud)
eig_val包含:
eig_val =
0.1092 0
0 2.6668
Run Code Online (Sandbox Code Playgroud)
eig_vec包含:
eig_vec =
0.0896 + 0.6789i 0.0953 + 0.7225i
-0.7288 + 0.0000i 0.6848 + 0.0000i
Run Code Online (Sandbox Code Playgroud)
这是我的python代码:
m = np.array([[1.46753694+0.j, 0.16692111+1.26535838j],
[0.16692111-1.26535838j, 1.30851770+0.j]])
eig_val,eig_vec = linalg.eigh(m)
Run Code Online (Sandbox Code Playgroud)
eig_val包含:
array([ 0.10923247, 2.66682217])
Run Code Online (Sandbox Code Playgroud)
eig_vec包含:
array([[-0.68477170+0.j , -0.72875765+0.j ],
[ 0.09530915-0.72249836j, -0.08955653+0.67889021j]])
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么这些输出是不同的,似乎每个两组不同的特征向量都是彼此的旋转版本.另一套更正确吗?
首先我必须说我是matlab的新手(以及这个网站......),所以请原谅我的无知.
我正在尝试在matlab中编写一个函数,它将使用Spectral Clustering将一组点分成两个簇.
我的代码如下
function Groups = TrySpectralClustering(data)
dist_mat = squareform(pdist(data));
W= zeros(length(data),length(data));
for i=1:length(data),
for j=(i+1):length(data),
W(i,j)=10^(-dist_mat(i,j));
W(j,i)=W(i,j);
end
end
D = zeros(length(data),length(data));
for i=1:length(W),
D(i,i)=sum(W(i,:));
end
L=D-W;
L=D^(-0.5)*L*D^(-0.5);
[ V E ] = eig(L);
disp ('V:');
disp (V);
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,那么通过使用第二个最小的特征向量,我应该能够将数据划分为两个聚类 - 如果第二个特征向量的第i个成员是正数,则第i个数据点将在一个聚类中,否则它将在另一个集群中.
但是,当我尝试以下
f=[1,1;0,0;1,0;0,1;100,100;100,101;101,101;101,100]
TrySpectralClustering(f)
Run Code Online (Sandbox Code Playgroud)
我希望前四个点组成一个簇,后四个组成另一个簇.
但是,我收到了
V:
-0.0000 -0.5000 0.0000 -0.5777 0.0000 0.4078 -0.0000 0.5000
-0.0000 -0.5000 0.0000 0.5777 0.0000 -0.4078 -0.0000 0.5000
-0.0000 -0.5000 0.0000 0.4078 0.0000 0.5777 -0.0000 -0.5000
-0.0000 -0.5000 0.0000 -0.4078 0.0000 -0.5777 -0.0000 …Run Code Online (Sandbox Code Playgroud) 让我们生成一个数组:
import numpy as np
data = np.arange(30).reshape(10,3)
data=data*data
array([[ 0, 1, 4],
[ 9, 16, 25],
[ 36, 49, 64],
[ 81, 100, 121],
[144, 169, 196],
[225, 256, 289],
[324, 361, 400],
[441, 484, 529],
[576, 625, 676],
[729, 784, 841]])
Run Code Online (Sandbox Code Playgroud)
然后找到协方差矩阵的特征值:
mn = np.mean(data, axis=0)
data -= mn
C = np.cov(data.T)
evals, evecs = la.eig(C)
idx = np.argsort(evals)[::-1]
evecs = evecs[:,idx]
print evecs
array([[-0.53926461, -0.73656433, 0.40824829],
[-0.5765472 , -0.03044111, -0.81649658],
[-0.61382979, 0.67568211, 0.40824829]])
Run Code Online (Sandbox Code Playgroud)
现在让我们对数据运行matplotlib.mlab.PCA函数:
import matplotlib.mlab as …Run Code Online (Sandbox Code Playgroud) 我正在创建一个可视化来说明主成分分析如何工作,通过绘制一些实际数据的特征值(为了说明的目的,我将子集化为2维).
我想要从这个梦幻般的PCA教程中结合这两个图,仅用于我的真实数据.


我可以绘制矢量并且一切正常:
Person1 <- c(-3,1,1,-3,0,-1,-1,0,-1,-1,3,4,5,-2,1,2,-2,-1,1,-2,1,-3,4,-6,1,-3,-4,3,3,-5,0,3,0,-3,1,-2,-1,0,-3,3,-4,-4,-7,-5,-2,-2,-1,1,1,2,0,0,2,-2,4,2,1,2,2,7,0,3,2,5,2,6,0,4,0,-2,-1,2,0,-1,-2,-4,-1)
Person2 <- c(-4,-3,4,-5,-1,-1,-2,2,1,0,3,2,3,-4,2,-1,2,-1,4,-2,6,-2,-1,-2,-1,-1,-3,5,2,-1,3,3,1,-3,1,3,-3,2,-2,4,-4,-6,-4,-7,0,-3,1,-2,0,2,-5,2,-2,-1,4,1,1,0,1,5,1,0,1,1,0,2,0,7,-2,3,-1,-2,-3,0,0,0,0)
df <- data.frame(cbind(Person1, Person2))
g <- ggplot(data = df, mapping = aes(x = Person1, y = Person2))
g <- g + geom_point(alpha = 1/3) # alpha b/c of overplotting
g <- g + geom_smooth(method = "lm") # just for comparsion
g <- g + coord_fixed() # otherwise, the angles of vectors are off
corre <- cor(x = df$Person1, y = df$Person2, method = …Run Code Online (Sandbox Code Playgroud) 我正在编写一个包含很多步骤 (PCA) 的算法,其中两个正在查找给定矩阵的特征值和特征向量。
我不想为它编写整个代码,因为我知道这是一项很长的工作,所以我为此搜索了一些临时代码,但只找到了 1 或 2 个库,起初我不想包含库,但我没有想转移到matlab。
是否有任何算法/教程/代码似乎不太难理解?
我正在尝试计算这个矩阵的特征向量和特征值
import numpy as np
la = 0.02
mi = 0.08
n = 500
d1 = np.full(n, -(la+mi), np.double)
d1[0] = -la
d1[-1] = -mi
d2 = np.full(n-1, la, np.double)
d3 = np.full(n-1, mi, np.double)
A = np.diagflat(d1) + np.diagflat(d2, -1) + np.diag(d3, 1)
e_values, e_vectors = np.linalg.eig(A)
Run Code Online (Sandbox Code Playgroud)
如果我将矩阵的维度设置为 n < 110,则输出很好。但是,如果我将其设置为 n >= 110,则特征值和特征向量分量都会变成具有显着虚部的复数。为什么会发生这种情况?它应该发生吗?这是非常奇怪的行为,坦率地说,我有点卡住了。
在MATLAB中我可以发出命令:
[X,L] = eig(A,'nobalance');
Run Code Online (Sandbox Code Playgroud)
为了计算没有平衡选项的特征值.
NumPy中的等效命令是什么?当我运行NumPy版本的eig时,它不会产生与打开nobalance的MATLAB结果相同的结果.
我有两个矩阵,其中一个矩阵的特征谱的一部分与另一个矩阵的特征谱非常相似,但我(目前)能够验证这一点的唯一方法是非常不优雅的。
我对任何解决方案都持开放态度,但为了在此处展示我所寻求的示例,我发现使用 MATLAB 语法最简单:在第一个示例中,我将定义矩阵,A并且B在B中也可以找到 的两个特征值A,以及相应的两个特征向量ofB也是A具有相同特征值的特征向量,但是如果不取其特征B值共享的特征向量A并“搜索”以查看这些相同的特征向量在 中是否具有相同的特征值,则这并不明显A。
下面是两个这样的矩阵A和的示例B:
A = diag([1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 1 -1 -1]);
B = diag([19.9385 7.6177 17.2969 9.6177 11.3208 -1 8.6792 1 11.3208 -1 8.6792 1 19.9385 7.6177 17.2969 9.6177]);
B(2,1) = 9.2832; B(4,3)=B(2,1); B(14,13)=-B(2,1); B(16,15)=-B(2,1);
B = tril(B,-1)'+B; % Make it …Run Code Online (Sandbox Code Playgroud) eigenvector ×10
eigenvalue ×5
matlab ×5
python ×5
numpy ×4
matrix ×2
pca ×2
c++ ×1
ggplot2 ×1
matplotlib ×1
octave ×1
r ×1