标签: svd

鸡尾酒会算法SVD实现......在一行代码中?

在Stanford的Andrew Ng在Coursera的机器学习入门讲座中的一篇幻灯片中,他给出了以下一行Octave解决方案,因为音频源由两个空间分离的麦克风录制:

[W,s,v]=svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');
Run Code Online (Sandbox Code Playgroud)

幻灯片的底部是"来源:Sam Roweis,Yair Weiss,Eero Simoncelli",而在之前幻灯片的底部则是"音频片段由Te-Won Lee提供".在视频中,吴教授说,

"所以你可能会看到这样无监督的学习,并问,'实现这个有多复杂?' 看起来为了构建这个应用程序,似乎要做这个音频处理,你会写大量的代码,或者可能链接到一堆处理音频的C++或Java库.看起来它真的是真的执行此音频的复杂程序:分离出音频等等.事实证明算法可以完成您刚刚听到的内容,只需一行代码即可完成...此处显示.确实需要研究人员很长时间想出这一行代码.所以我并不是说这是一个容易出问题的问题.但事实证明,当你使用正确的编程环境时,很多学习算法都会成为很短的程序."

在视频讲座中播放的分离音频结果并不完美,但在我看来,令人惊叹.有没有人知道这一行代码如何表现如此之好?特别是,有没有人知道有关这一行代码的Te-Won Lee,Sam Roweis,Yair Weiss和Eero Simoncelli的工作的参考资料?

UPDATE

为了演示算法对麦克风间隔距离的敏感度,以下模拟(在Octave中)将音调与两个空间分离的音调发生器分开.

% define model 
f1 = 1100;              % frequency of tone generator 1; unit: Hz 
f2 = 2900;              % frequency of tone generator 2; unit: Hz 
Ts = 1/(40*max(f1,f2)); % sampling period; unit: s 
dMic = 1;               % distance between microphones centered about origin; unit: m 
dSrc = 10;              % distance between tone generators centered about origin; unit: m 
c = 340.29;             % speed …
Run Code Online (Sandbox Code Playgroud)

matlab machine-learning linear-algebra octave svd

78
推荐指数
2
解决办法
3万
查看次数

PCA或SVD在机器学习中的重要性

所有这些时间(特别是在Netflix竞赛中),我总是遇到这个博客(或排行榜论坛),他们提到如何通过对数据应用简单的SVD步骤帮助他们减少数据的稀疏性或者通常提高他们的算法的性能手.我想(很久以来),但我无法猜测为什么会如此.一般来说,我得到的数据非常嘈杂(这也是bigdata的有趣部分),然后我知道一些基本的功能扩展,如日志转换的东西,平均规范化.但是像SVD这样的东西有什么帮助.所以,假设我有一个巨大的用户评级电影矩阵......然后在这个矩阵中,我实现了一些推荐系统版本(比如协同过滤):

1) Without SVD
2) With SVD
Run Code Online (Sandbox Code Playgroud)

它是如何帮助谢谢的

machine-learning netflix data-mining svd bigdata

35
推荐指数
2
解决办法
2万
查看次数

什么是SVD(奇异值分解)

它是如何真正减少噪音的..你能建议一些不错的教程吗?

math matrix linear-algebra svd

33
推荐指数
4
解决办法
1万
查看次数

要采用多少主要组件?

我知道主成分分析在矩阵上进行SVD​​,然后生成特征值矩阵.要选择主成分,我们必须只取前几个特征值.现在,我们如何决定我们应该从特征值矩阵中获取的特征值的数量?

machine-learning data-mining svd

33
推荐指数
6
解决办法
5万
查看次数

Python(NumPy,SciPy),找到矩阵的零空间

我试图找到给定矩阵的零空间(Ax = 0的解空间).我找到了两个例子,但我似乎无法工作.而且,我无法理解他们为实现目标所做的工作,所以我无法调试.我希望有人能够指引我完成这件事.

文档页面(numpy.linalg.svd,和numpy.compress)对我来说是不透明的.我通过创建矩阵C = [A|0],找到减少的行梯形形式并按行求解变量来学习.在这些例子中,我似乎无法遵循它是如何完成的.

感谢您的帮助!

这是我的示例矩阵,它与维基百科示例相同:

A = matrix([
    [2,3,5],
    [-4,2,3]
    ])  
Run Code Online (Sandbox Code Playgroud)

方法(在这里这里找到):

import scipy
from scipy import linalg, matrix
def null(A, eps=1e-15):
    u, s, vh = scipy.linalg.svd(A)
    null_mask = (s <= eps)
    null_space = scipy.compress(null_mask, vh, axis=0)
    return scipy.transpose(null_space)
Run Code Online (Sandbox Code Playgroud)

当我尝试它时,我得到一个空矩阵:

Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import scipy
>>> …
Run Code Online (Sandbox Code Playgroud)

numpy matrix linear-algebra scipy svd

28
推荐指数
4
解决办法
3万
查看次数

在scikit-learn中从截断的SVD获取U,Sigma,V*矩阵

我在scikit-learn 封装中使用截断的SVD .

在SVD的定义中,原始矩阵被approxmated作为产品UΣV*其中ùV具有正交列,并且Σ是非负对角线.

我需要得到U,ΣV*矩阵.

看一下这里的源代码,我发现调用后V*存储在self.components_字段中fit_transform.

是否有可能得到U  和Σ矩阵?

我的代码:

import sklearn.decomposition as skd
import numpy as np

matrix = np.random.random((20,20))
trsvd = skd.TruncatedSVD(n_components=15)
transformed = trsvd.fit_transform(matrix)
VT = trsvd.components_
Run Code Online (Sandbox Code Playgroud)

python scipy sparse-matrix svd scikit-learn

23
推荐指数
4
解决办法
2万
查看次数

用numpy的eigh和svd计算的特征向量不匹配

考虑奇异值分解M = USV*.然后,M*M的特征值分解给出M*M = V(S*S)V*= VS*U*USV*.我希望通过显示eigh函数返回的特征向量与函数返回的特征向量相同来验证numpy的这种相等svd性:

import numpy as np
np.random.seed(42)
# create mean centered data
A=np.random.randn(50,20)
M= A-np.array(A.mean(0),ndmin=2)

# svd
U1,S1,V1=np.linalg.svd(M) 
S1=np.square(S1)
V1=V1.T  

# eig
S2,V2=np.linalg.eigh(np.dot(M.T,M))
indx=np.argsort(S2)[::-1]
S2=S2[indx]
V2=V2[:,indx]

# both Vs are in orthonormal form
assert np.all(np.isclose(np.linalg.norm(V1,axis=1), np.ones(V1.shape[0])))
assert np.all(np.isclose(np.linalg.norm(V1,axis=0), np.ones(V1.shape[1])))
assert np.all(np.isclose(np.linalg.norm(V2,axis=1), np.ones(V2.shape[0])))
assert np.all(np.isclose(np.linalg.norm(V2,axis=0), np.ones(V2.shape[1])))

assert np.all(np.isclose(S1,S2))
assert np.all(np.isclose(V1,V2))
Run Code Online (Sandbox Code Playgroud)

最后一个断言失败了.为什么?

python numpy svd eigenvector

16
推荐指数
1
解决办法
4484
查看次数

使用SVD在MATLAB中压缩图像

我是MATLAB的新手,但我正在尝试为灰度图像做一些图像压缩代码.

问题

如何使用SVD修剪低值特征值来重建压缩图像?

到目前为止的工作/尝试

到目前为止我的代码是:

B=imread('images1.jpeg');   
B=rgb2gray(B);  
doubleB=double(B);  
%read the image and store it as matrix B, convert the image to a grayscale
photo and convert the matrix to a class 'double' for values 0-255  
[U,S,V]=svd(doubleB);
Run Code Online (Sandbox Code Playgroud)

这允许我用存储在变量S中的特征值成功地分解图像矩阵.

如何截断S(167x301,类double)?让我们说一下167个特征值我只想要前100个(或任何n个),我该怎么做并重建压缩图像?

更新了代码/想法

这不是在评论部分放置一堆代码,而是我现有的草案.我已经能够通过手动更改N来成功创建压缩图像,但我还想做两件事:

1-显示各种压缩图像的面板(i/e,运行N = 5,10,25等的循环)

2-以某种方式计算每个图像与原始图像之间的差异(误差)并绘制图形.

我理解循环和输出很糟糕,但这是我尝试过的:

B=imread('images1.jpeg');  
B=rgb2gray(B);  
doubleB=im2double(B);%  
%read the image and store it as matrix B, convert the image to a grayscale  
%photo and convert the image to a class 'double'  
[U,S,V]=svd(doubleB);   
C=S;  
for N=[5,10,25,50,100]  
C(N+1:end,:)=0;  
C(:,N+1:end)=0;  
D=U*C*V';  
%Use …
Run Code Online (Sandbox Code Playgroud)

matlab image-processing octave svd image-compression

15
推荐指数
3
解决办法
2万
查看次数

SVD计算在Matlab和OpenCV中的结果不同

我想知道为什么Matlab和OpenCV中的SVD计算结果存在符号差异.我输入相同的矩阵

          3.65E+06  -2.09E+06   0
 YY =    -2.09E+06  2.45E+06    0
           0         0          0

[U,S,V] = svd(YY);//Matlab


        -0.798728902689475  0.601691066917623   0
   V =  0.601691066917623   0.798728902689475   0
         0                  0                   1

cv::SVD::compute(YY, S, U, V);//opencv

     0.798839   -0.601544   0
V =  0.601544   0.798839    0
     0          0           1
Run Code Online (Sandbox Code Playgroud)

我知道他们使用相同的算法,为什么有符号差异?谢谢

matlab opencv linear-algebra svd

14
推荐指数
1
解决办法
7637
查看次数

使用sklearn在大型稀疏矩阵上执行PCA

我试图在巨大的稀疏矩阵上应用PCA,在下面的链接中它说sklearn的randomizedPCA可以处理scipy稀疏格式的稀疏矩阵. 在非常大的稀疏矩阵上应用PCA

但是,我总是得到错误.有人可以指出我做错了什么.

输入矩阵'X_train'包含float64中的数字:

>>>type(X_train)
<class 'scipy.sparse.csr.csr_matrix'>
>>>X_train.shape
(2365436, 1617899)
>>>X_train.ndim 
2
>>>X_train[0]     
<1x1617899 sparse matrix of type '<type 'numpy.float64'>'
    with 81 stored elements in Compressed Sparse Row format>
Run Code Online (Sandbox Code Playgroud)

我想做:

>>>from sklearn.decomposition import RandomizedPCA
>>>pca = RandomizedPCA()
>>>pca.fit(X_train)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/RT11/.pyenv/versions/2.7.9/lib/python2.7/site-packages/sklearn/decomposition/pca.py", line 567, in fit
    self._fit(check_array(X))
  File "/home/RT11/.pyenv/versions/2.7.9/lib/python2.7/site-packages/sklearn/utils/validation.py", line 334, in check_array
    copy, force_all_finite)
  File "/home/RT11/.pyenv/versions/2.7.9/lib/python2.7/site-packages/sklearn/utils/validation.py", line 239, in _ensure_sparse_format
    raise TypeError('A sparse matrix was passed, but dense '
TypeError: …
Run Code Online (Sandbox Code Playgroud)

python sparse-matrix svd pca scikit-learn

14
推荐指数
2
解决办法
1万
查看次数