- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设存在一个矩阵B
,其大小为500*1000 double
(此处,500
表示观测值的数量,1000
表示要素的数量)。sigma
是B
的协方差矩阵,D
是对角线矩阵,其对角线元素是sigma
的特征值。假设A
是协方差矩阵sigma
的特征向量。
我有以下问题:
我需要选择与最大特征值相对应的第一个k = 800
特征向量,以对所选特征进行排名。最后的矩阵名为Aq
。如何在MATLAB中执行此操作?
这些选定的特征向量是什么意思?
一旦计算出Aq
,看来最终矩阵1000*800 double
的大小为Aq
。 500
的时间点/观察信息已消失。对于最终矩阵Aq
,矩阵1000
中的值Aq
现在代表什么?另外,矩阵800
中的值Aq
现在代表什么?
最佳答案
我假设您从eig
函数确定了特征向量。我以后建议您使用eigs
函数。这不仅为您计算特征值和特征向量,还将为您计算k
最大特征值及其关联的特征向量。这样就可以节省计算开销,因为您只需要一个子集,就不必计算矩阵的所有特征值和相关特征向量。您只需将数据的协方差矩阵提供给eigs
,它就会为您返回k
最大的特征值和特征向量。
现在,回到您的问题,您所描述的最终是Principal Component Analysis。其背后的机制是计算数据的协方差矩阵,并找到计算结果的特征值和特征向量。众所周知,由于计算大型矩阵的特征值和特征向量时数值不稳定,因此不建议这样做。现在最典型的方法是通过Singular Value Decomposition。具体而言,V
矩阵的列为您提供协方差矩阵的特征向量或主成分,并且相关的特征值是矩阵S
的对角线中产生的奇异值的平方根。
请参阅有关交叉验证的信息,以了解为什么偏爱此方法:
https://stats.stackexchange.com/questions/79043/why-pca-of-data-by-means-of-svd-of-the-data
我还将在另一个链接中讨论在主成分分析中为何使用奇异值分解的理论:
https://stats.stackexchange.com/questions/134282/relationship-between-svd-and-pca-how-to-use-svd-to-perform-pca
现在让我们一次回答您的问题。
问题1
MATLAB以未排序的方式生成特征值和特征向量的相应顺序。如果要根据给定的k
输出(在本例中为800)选择最大的eig
特征值和相关特征向量,则需要按降序对特征值进行排序,然后重新排列产生的特征向量矩阵的列从eig
然后选择第一个k
值。
我还应注意,使用eigs
不能保证排序顺序,因此当涉及到排序顺序时,您也必须明确地对它们进行排序。
在MATLAB中,执行我们上面描述的操作看起来像这样:
sigma = cov(B);
[A,D] = eig(sigma);
vals = diag(D);
[~,ind] = sort(abs(vals), 'descend');
Asort = A(:,ind);
B
中,代码的第一行也会找到
sigma
的协方差矩阵,但是让我们使其可重现。接下来,我们找到协方差矩阵的特征值和相关的特征向量。请注意,特征向量矩阵
A
的每一列代表一个特征向量。具体来说,
A
的第i列/特征向量对应于
D
中的第i个特征值。
diag
命令提取对角线,对其进行排序并找出它们的顺序,然后重新排列
A
以遵守该顺序。我使用
sort
的第二个输出,因为它告诉您未排序结果中每个值将出现在排序结果中的位置。这是我们需要重新排列特征向量矩阵
A
的列的顺序。必须选择
'descend'
作为标志,以便最大的特征值和相关的特征向量首先出现,就像我们之前讨论过的一样。
k
个最大的向量和值:
k = 800;
Aq = Asort(:,1:k);
(1,3)
为中心的双变量高斯分布进行分布的样本的散点图,其标准偏差在
(0.878, 0.478)
方向上为3,在正交方向上为1。标准偏差为3的分量是第一主分量,而正交的分量是第二分量。所示向量是协方差矩阵的特征向量,该特征向量由相应特征值的平方根缩放,并进行了平移,因此它们的尾部位于平均位置。
k
最大特征值的原因是执行
dimensionality reduction的一种方式。本质上,您将执行数据压缩,其中将获取较高维度的数据并将其投影到较低维度的空间。投影中包含的主要成分越多,它与原始数据的相似度就越高。实际上,它在某个点开始逐渐减小,但是前几个主要组件使您可以在大多数情况下忠实地重建数据。
k
最大向量),并且可以使用比以前更少的信息来创建数据的近似值。
Bm = bsxfun(@minus, B, mean(B,1));
Bm
将生成一个矩阵,其中每个样本的每个特征均被减去。
bsxfun
允许以不相等的维数减去两个矩阵,前提是您可以广播维,以便它们都可以匹配。具体而言,在这种情况下将发生的是,将计算
B
的每列/特征的均值,并将生成一个与
B
一样大的临时复制矩阵。当您使用此复制矩阵减去原始数据时,效果将减去每个数据点及其各自的特征均值,从而分散数据,使每个特征的均值为0。
Bproject = Bm*Asort;
out = bsxfun(@plus, Bproject*Asort.', mean(B, 1));
Bm
问题。但是,
Asort
的逆仅是此处的转置。执行此操作后发生的事情是,您正在取回原始数据,但是数据仍然是分散的。要取回原始数据,必须将每个要素的平均值重新添加到数据矩阵中以获得最终结果。这就是为什么我们在这里使用另一个
bsxfun
调用,以便您可以对每个样本的特征值执行此操作的原因。
Asort
替换为
Aq
,并减少在
Bproject
中使用的功能数量。具体来说:
out = bsxfun(@plus, Bproject(:,1:k)*Aq.', mean(B, 1));
Bproject(:,1:k)
会在数据的投影域中选择
k
特征,这些特征对应于
k
最大的特征向量。有趣的是,如果您只想表示关于降低维数的数据,则只需使用
Bproject(:,1:k)
就足够了。但是,如果要继续计算原始数据的近似值,则需要计算反向步长。上面的代码只是我们以前处理数据完整维度时的代码,但是我们使用
Aq
并在
k
中选择
Bproject
功能。这将为您提供由矩阵中
k
个最大特征向量/特征值表示的原始数据。
im = imread('camerman.tif');
imshow(im); %// Using the image processing toolbox
double
,以精确计算协方差矩阵。现在,我要做的是重复上面的代码,但是每次将
k
分别从3、11、15、25、45、65和125递增。因此,对于每个
k
,我们都引入了更多主要组成部分,我们应该慢慢开始重建我们的数据。
%%%%%%%// Pre-processing stage
clear all;
close all;
%// Read in image - make sure we cast to double
B = double(imread('cameraman.tif'));
%// Calculate covariance matrix
sigma = cov(B);
%// Find eigenvalues and eigenvectors of the covariance matrix
[A,D] = eig(sigma);
vals = diag(D);
%// Sort their eigenvalues
[~,ind] = sort(abs(vals), 'descend');
%// Rearrange eigenvectors
Asort = A(:,ind);
%// Find mean subtracted data
Bm = bsxfun(@minus, B, mean(B,1));
%// Reproject data onto principal components
Bproject = Bm*Asort;
%%%%%%%// Begin reconstruction logic
figure;
counter = 1;
for k = [3 11 15 25 45 65 125 155]
%// Extract out highest k eigenvectors
Aq = Asort(:,1:k);
%// Project back onto original domain
out = bsxfun(@plus, Bproject(:,1:k)*Aq.', mean(B, 1));
%// Place projection onto right slot and show the image
subplot(4, 2, counter);
counter = counter + 1;
imshow(out,[]);
title(['k = ' num2str(k)]);
end
k
的所有值,并投影回具有
k
最高特征向量的原始空间(即计算近似值),然后显示图像。
k=3
开头并没有给我们带来任何好处...我们可以看到一些常规结构,但是添加更多内容不会受到损害。随着我们开始增加组件数量,我们开始以更清晰地了解原始数据的外观。在
k=25
处,我们实际上可以看到摄影师的样子,并且我们不需要组件26或其他组件来查看正在发生的事情。这就是我在谈论数据压缩时所需要的,您无需在所有主要组件上进行工作即可清楚了解正在发生的事情。
关于matlab - 在协方差矩阵中选择最大特征值和特征向量在数据分析中意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31884985/
设置 我希望能够定义一个特征,使得任何实现该特征的结构不仅必须实现函数,而且还必须为某些常量指定值。所以也许是这样的: trait MyTrait { const MY_CONST: u8;
在我的 Web 应用程序中,授权用户至少有 4 个“方面”:http session 相关数据、持久数据、facebook 数据、运行时业务数据。 我决定使用案例类组合而不是特征至少有两个原因: 性状
我正在尝试使用以下代码从类中获取完整数据成员的列表: import std.stdio; import std.traits; class D { static string[] integr
我正在尝试实现 From对于我的一种类型。它应该消耗任意长度的行(仅在运行时已知)并从行中获取数据。编译器提示 &[&str; 2]不是 &[&str] ,即它不能将固定大小的切片转换为任意长度的切片
有人可以请你这么好心,并指出一种提取拟合树中使用的列/特征的方法,使用如下代码: library(dplyr) library(caret) library(rpart) df % dplyr
假设我定义了一个 Group所有组操作的特征。是否可以创建一个包装器AGroup超过 Group无需手动派生所有操作? 基本上,我想要这个: #[derive (Copy, Debug, Clone,
最近浏览了Markus Stocker的博客他很好地解释了如何在使用 observation 时表示传感器观察结果。 SSN 的模块本体论。我完全理解他的解释,但我发现有一件事多余地代表了一个的两个特
我有以下情况/代码; trait Model { def myField: String } case class MyModel(myField: String) extends Model
我想让一个案例类扩展一个特征 以下是我的要求: 我需要为 child 使用案例类。这是一个硬性要求,因为 scopt ( https://github.com/scopt/scopt ) parent
最近浏览了Markus Stocker的博客他很好地解释了如何在使用 observation 时表示传感器观察结果。 SSN 的模块本体论。我完全理解他的解释,但我发现有一件事多余地代表了一个的两个特
我有以下情况/代码; trait Model { def myField: String } case class MyModel(myField: String) extends Model
不确定标题是否完全有意义,对此感到抱歉。我是机器学习新手,正在使用 Scikit 和决策树。 这就是我想做的;我想获取所有输入并包含一个独特的功能,即客户端 ID。现在,客户端 ID 是唯一的,无法以
我想读取具有 Eigen 的 MNIST 数据集,每个文件都由一个矩阵表示。我希望在运行时确定矩阵大小,因为训练集和测试集的大小不同。 Map> MNIST_dataset((uchar*)*_dat
在 MATLAB 中,我可以选择一个分散的子矩阵,例如: A = [1 ,2 ,3;4,5,6;7,8,9] A([1,3],[1,3]) = [1,3;7,9] 有没有用 Eigen 做到这一点的聪
我在执行 Into 时遇到问题Rust 中通用结构的特征。下面是我正在尝试做的简化版本: struct Wrapper { value: T } impl Into for Wrapper {
我有这段 matlab 代码,我想用 Eigen 编写: [V_K,D_K] = eig(K); d_k = diag(D_K); ind_k = find(d_k > 1e-8); d_k(ind_
我正在使用 Eigen C++ 矩阵库,我想获取对矩阵列的引用。文档说要使用 matrix_object.col(index),但这似乎返回了一个表示列的对象,而不是简单地引用原始矩阵对象中的列。我担
在乘以很多旋转矩阵之后,由于舍入问题(去正交化),最终结果可能不再是有效的旋转矩阵 重新正交化的一种方法是遵循以下步骤: 将旋转矩阵转换为轴角表示法 ( link ) 将轴角转换回旋转矩阵 ( lin
定义可由命名空间中的多个类使用的常量的最佳方法是什么?我试图避免太多的继承,所以扩展基类不是一个理想的解决方案,我正在努力寻找一个使用特征的好的解决方案。这在 PHP 5.4 中是可行的还是应该采用不
定义可由命名空间中的多个类使用的常量的最佳方法是什么?我试图避免太多的继承,所以扩展基类不是一个理想的解决方案,我正在努力寻找一个使用特征的好的解决方案。这在 PHP 5.4 中是可行的还是应该采用不
我是一名优秀的程序员,十分优秀!