标签归档:pca

Python中的主成分分析

问题:Python中的主成分分析

我想使用主成分分析(PCA)进行降维。numpy或scipy是否已经拥有它,或者我必须使用自己滚动numpy.linalg.eigh

我不只是想使用奇异值分解(SVD),因为我的输入数据是相当高的维度(约460个维度),因此我认为SVD比计算协方差矩阵的特征向量要慢。

我希望找到一个预制的,已调试的实现,该实现已经对何时使用哪种方法以及哪些可能进行的其他优化进行了正确的决策,而这些优化我都不知道。

I’d like to use principal component analysis (PCA) for dimensionality reduction. Does numpy or scipy already have it, or do I have to roll my own using numpy.linalg.eigh?

I don’t just want to use singular value decomposition (SVD) because my input data are quite high-dimensional (~460 dimensions), so I think SVD will be slower than computing the eigenvectors of the covariance matrix.

I was hoping to find a premade, debugged implementation that already makes the right decisions for when to use which method, and which maybe does other optimizations that I don’t know about.


回答 0

您可以看看MDP

我没有机会亲自对其进行测试,但是我已将其完全标记为PCA功能。

You might have a look at MDP.

I have not had the chance to test it myself, but I’ve bookmarked it exactly for the PCA functionality.


回答 1

几个月后,这是一门小型PCA和一张图片:

#!/usr/bin/env python
""" a small class for Principal Component Analysis
Usage:
    p = PCA( A, fraction=0.90 )
In:
    A: an array of e.g. 1000 observations x 20 variables, 1000 rows x 20 columns
    fraction: use principal components that account for e.g.
        90 % of the total variance

Out:
    p.U, p.d, p.Vt: from numpy.linalg.svd, A = U . d . Vt
    p.dinv: 1/d or 0, see NR
    p.eigen: the eigenvalues of A*A, in decreasing order (p.d**2).
        eigen[j] / eigen.sum() is variable j's fraction of the total variance;
        look at the first few eigen[] to see how many PCs get to 90 %, 95 % ...
    p.npc: number of principal components,
        e.g. 2 if the top 2 eigenvalues are >= `fraction` of the total.
        It's ok to change this; methods use the current value.

Methods:
    The methods of class PCA transform vectors or arrays of e.g.
    20 variables, 2 principal components and 1000 observations,
    using partial matrices U' d' Vt', parts of the full U d Vt:
    A ~ U' . d' . Vt' where e.g.
        U' is 1000 x 2
        d' is diag([ d0, d1 ]), the 2 largest singular values
        Vt' is 2 x 20.  Dropping the primes,

    d . Vt      2 principal vars = p.vars_pc( 20 vars )
    U           1000 obs = p.pc_obs( 2 principal vars )
    U . d . Vt  1000 obs, p.obs( 20 vars ) = pc_obs( vars_pc( vars ))
        fast approximate A . vars, using the `npc` principal components

    Ut              2 pcs = p.obs_pc( 1000 obs )
    V . dinv        20 vars = p.pc_vars( 2 principal vars )
    V . dinv . Ut   20 vars, p.vars( 1000 obs ) = pc_vars( obs_pc( obs )),
        fast approximate Ainverse . obs: vars that give ~ those obs.


Notes:
    PCA does not center or scale A; you usually want to first
        A -= A.mean(A, axis=0)
        A /= A.std(A, axis=0)
    with the little class Center or the like, below.

See also:
    http://en.wikipedia.org/wiki/Principal_component_analysis
    http://en.wikipedia.org/wiki/Singular_value_decomposition
    Press et al., Numerical Recipes (2 or 3 ed), SVD
    PCA micro-tutorial
    iris-pca .py .png

"""

from __future__ import division
import numpy as np
dot = np.dot
    # import bz.numpyutil as nu
    # dot = nu.pdot

__version__ = "2010-04-14 apr"
__author_email__ = "denis-bz-py at t-online dot de"

#...............................................................................
class PCA:
    def __init__( self, A, fraction=0.90 ):
        assert 0 <= fraction <= 1
            # A = U . diag(d) . Vt, O( m n^2 ), lapack_lite --
        self.U, self.d, self.Vt = np.linalg.svd( A, full_matrices=False )
        assert np.all( self.d[:-1] >= self.d[1:] )  # sorted
        self.eigen = self.d**2
        self.sumvariance = np.cumsum(self.eigen)
        self.sumvariance /= self.sumvariance[-1]
        self.npc = np.searchsorted( self.sumvariance, fraction ) + 1
        self.dinv = np.array([ 1/d if d > self.d[0] * 1e-6  else 0
                                for d in self.d ])

    def pc( self ):
        """ e.g. 1000 x 2 U[:, :npc] * d[:npc], to plot etc. """
        n = self.npc
        return self.U[:, :n] * self.d[:n]

    # These 1-line methods may not be worth the bother;
    # then use U d Vt directly --

    def vars_pc( self, x ):
        n = self.npc
        return self.d[:n] * dot( self.Vt[:n], x.T ).T  # 20 vars -> 2 principal

    def pc_vars( self, p ):
        n = self.npc
        return dot( self.Vt[:n].T, (self.dinv[:n] * p).T ) .T  # 2 PC -> 20 vars

    def pc_obs( self, p ):
        n = self.npc
        return dot( self.U[:, :n], p.T )  # 2 principal -> 1000 obs

    def obs_pc( self, obs ):
        n = self.npc
        return dot( self.U[:, :n].T, obs ) .T  # 1000 obs -> 2 principal

    def obs( self, x ):
        return self.pc_obs( self.vars_pc(x) )  # 20 vars -> 2 principal -> 1000 obs

    def vars( self, obs ):
        return self.pc_vars( self.obs_pc(obs) )  # 1000 obs -> 2 principal -> 20 vars


class Center:
    """ A -= A.mean() /= A.std(), inplace -- use A.copy() if need be
        uncenter(x) == original A . x
    """
        # mttiw
    def __init__( self, A, axis=0, scale=True, verbose=1 ):
        self.mean = A.mean(axis=axis)
        if verbose:
            print "Center -= A.mean:", self.mean
        A -= self.mean
        if scale:
            std = A.std(axis=axis)
            self.std = np.where( std, std, 1. )
            if verbose:
                print "Center /= A.std:", self.std
            A /= self.std
        else:
            self.std = np.ones( A.shape[-1] )
        self.A = A

    def uncenter( self, x ):
        return np.dot( self.A, x * self.std ) + np.dot( x, self.mean )


#...............................................................................
if __name__ == "__main__":
    import sys

    csv = "iris4.csv"  # wikipedia Iris_flower_data_set
        # 5.1,3.5,1.4,0.2  # ,Iris-setosa ...
    N = 1000
    K = 20
    fraction = .90
    seed = 1
    exec "\n".join( sys.argv[1:] )  # N= ...
    np.random.seed(seed)
    np.set_printoptions( 1, threshold=100, suppress=True )  # .1f
    try:
        A = np.genfromtxt( csv, delimiter="," )
        N, K = A.shape
    except IOError:
        A = np.random.normal( size=(N, K) )  # gen correlated ?

    print "csv: %s  N: %d  K: %d  fraction: %.2g" % (csv, N, K, fraction)
    Center(A)
    print "A:", A

    print "PCA ..." ,
    p = PCA( A, fraction=fraction )
    print "npc:", p.npc
    print "% variance:", p.sumvariance * 100

    print "Vt[0], weights that give PC 0:", p.Vt[0]
    print "A . Vt[0]:", dot( A, p.Vt[0] )
    print "pc:", p.pc()

    print "\nobs <-> pc <-> x: with fraction=1, diffs should be ~ 0"
    x = np.ones(K)
    # x = np.ones(( 3, K ))
    print "x:", x
    pc = p.vars_pc(x)  # d' Vt' x
    print "vars_pc(x):", pc
    print "back to ~ x:", p.pc_vars(pc)

    Ax = dot( A, x.T )
    pcx = p.obs(x)  # U' d' Vt' x
    print "Ax:", Ax
    print "A'x:", pcx
    print "max |Ax - A'x|: %.2g" % np.linalg.norm( Ax - pcx, np.inf )

    b = Ax  # ~ back to original x, Ainv A x
    back = p.vars(b)
    print "~ back again:", back
    print "max |back - x|: %.2g" % np.linalg.norm( back - x, np.inf )

# end pca.py

Months later, here’s a small class PCA, and a picture:

#!/usr/bin/env python
""" a small class for Principal Component Analysis
Usage:
    p = PCA( A, fraction=0.90 )
In:
    A: an array of e.g. 1000 observations x 20 variables, 1000 rows x 20 columns
    fraction: use principal components that account for e.g.
        90 % of the total variance

Out:
    p.U, p.d, p.Vt: from numpy.linalg.svd, A = U . d . Vt
    p.dinv: 1/d or 0, see NR
    p.eigen: the eigenvalues of A*A, in decreasing order (p.d**2).
        eigen[j] / eigen.sum() is variable j's fraction of the total variance;
        look at the first few eigen[] to see how many PCs get to 90 %, 95 % ...
    p.npc: number of principal components,
        e.g. 2 if the top 2 eigenvalues are >= `fraction` of the total.
        It's ok to change this; methods use the current value.

Methods:
    The methods of class PCA transform vectors or arrays of e.g.
    20 variables, 2 principal components and 1000 observations,
    using partial matrices U' d' Vt', parts of the full U d Vt:
    A ~ U' . d' . Vt' where e.g.
        U' is 1000 x 2
        d' is diag([ d0, d1 ]), the 2 largest singular values
        Vt' is 2 x 20.  Dropping the primes,

    d . Vt      2 principal vars = p.vars_pc( 20 vars )
    U           1000 obs = p.pc_obs( 2 principal vars )
    U . d . Vt  1000 obs, p.obs( 20 vars ) = pc_obs( vars_pc( vars ))
        fast approximate A . vars, using the `npc` principal components

    Ut              2 pcs = p.obs_pc( 1000 obs )
    V . dinv        20 vars = p.pc_vars( 2 principal vars )
    V . dinv . Ut   20 vars, p.vars( 1000 obs ) = pc_vars( obs_pc( obs )),
        fast approximate Ainverse . obs: vars that give ~ those obs.


Notes:
    PCA does not center or scale A; you usually want to first
        A -= A.mean(A, axis=0)
        A /= A.std(A, axis=0)
    with the little class Center or the like, below.

See also:
    http://en.wikipedia.org/wiki/Principal_component_analysis
    http://en.wikipedia.org/wiki/Singular_value_decomposition
    Press et al., Numerical Recipes (2 or 3 ed), SVD
    PCA micro-tutorial
    iris-pca .py .png

"""

from __future__ import division
import numpy as np
dot = np.dot
    # import bz.numpyutil as nu
    # dot = nu.pdot

__version__ = "2010-04-14 apr"
__author_email__ = "denis-bz-py at t-online dot de"

#...............................................................................
class PCA:
    def __init__( self, A, fraction=0.90 ):
        assert 0 <= fraction <= 1
            # A = U . diag(d) . Vt, O( m n^2 ), lapack_lite --
        self.U, self.d, self.Vt = np.linalg.svd( A, full_matrices=False )
        assert np.all( self.d[:-1] >= self.d[1:] )  # sorted
        self.eigen = self.d**2
        self.sumvariance = np.cumsum(self.eigen)
        self.sumvariance /= self.sumvariance[-1]
        self.npc = np.searchsorted( self.sumvariance, fraction ) + 1
        self.dinv = np.array([ 1/d if d > self.d[0] * 1e-6  else 0
                                for d in self.d ])

    def pc( self ):
        """ e.g. 1000 x 2 U[:, :npc] * d[:npc], to plot etc. """
        n = self.npc
        return self.U[:, :n] * self.d[:n]

    # These 1-line methods may not be worth the bother;
    # then use U d Vt directly --

    def vars_pc( self, x ):
        n = self.npc
        return self.d[:n] * dot( self.Vt[:n], x.T ).T  # 20 vars -> 2 principal

    def pc_vars( self, p ):
        n = self.npc
        return dot( self.Vt[:n].T, (self.dinv[:n] * p).T ) .T  # 2 PC -> 20 vars

    def pc_obs( self, p ):
        n = self.npc
        return dot( self.U[:, :n], p.T )  # 2 principal -> 1000 obs

    def obs_pc( self, obs ):
        n = self.npc
        return dot( self.U[:, :n].T, obs ) .T  # 1000 obs -> 2 principal

    def obs( self, x ):
        return self.pc_obs( self.vars_pc(x) )  # 20 vars -> 2 principal -> 1000 obs

    def vars( self, obs ):
        return self.pc_vars( self.obs_pc(obs) )  # 1000 obs -> 2 principal -> 20 vars


class Center:
    """ A -= A.mean() /= A.std(), inplace -- use A.copy() if need be
        uncenter(x) == original A . x
    """
        # mttiw
    def __init__( self, A, axis=0, scale=True, verbose=1 ):
        self.mean = A.mean(axis=axis)
        if verbose:
            print "Center -= A.mean:", self.mean
        A -= self.mean
        if scale:
            std = A.std(axis=axis)
            self.std = np.where( std, std, 1. )
            if verbose:
                print "Center /= A.std:", self.std
            A /= self.std
        else:
            self.std = np.ones( A.shape[-1] )
        self.A = A

    def uncenter( self, x ):
        return np.dot( self.A, x * self.std ) + np.dot( x, self.mean )


#...............................................................................
if __name__ == "__main__":
    import sys

    csv = "iris4.csv"  # wikipedia Iris_flower_data_set
        # 5.1,3.5,1.4,0.2  # ,Iris-setosa ...
    N = 1000
    K = 20
    fraction = .90
    seed = 1
    exec "\n".join( sys.argv[1:] )  # N= ...
    np.random.seed(seed)
    np.set_printoptions( 1, threshold=100, suppress=True )  # .1f
    try:
        A = np.genfromtxt( csv, delimiter="," )
        N, K = A.shape
    except IOError:
        A = np.random.normal( size=(N, K) )  # gen correlated ?

    print "csv: %s  N: %d  K: %d  fraction: %.2g" % (csv, N, K, fraction)
    Center(A)
    print "A:", A

    print "PCA ..." ,
    p = PCA( A, fraction=fraction )
    print "npc:", p.npc
    print "% variance:", p.sumvariance * 100

    print "Vt[0], weights that give PC 0:", p.Vt[0]
    print "A . Vt[0]:", dot( A, p.Vt[0] )
    print "pc:", p.pc()

    print "\nobs <-> pc <-> x: with fraction=1, diffs should be ~ 0"
    x = np.ones(K)
    # x = np.ones(( 3, K ))
    print "x:", x
    pc = p.vars_pc(x)  # d' Vt' x
    print "vars_pc(x):", pc
    print "back to ~ x:", p.pc_vars(pc)

    Ax = dot( A, x.T )
    pcx = p.obs(x)  # U' d' Vt' x
    print "Ax:", Ax
    print "A'x:", pcx
    print "max |Ax - A'x|: %.2g" % np.linalg.norm( Ax - pcx, np.inf )

    b = Ax  # ~ back to original x, Ainv A x
    back = p.vars(b)
    print "~ back again:", back
    print "max |back - x|: %.2g" % np.linalg.norm( back - x, np.inf )

# end pca.py


回答 2

使用PCA numpy.linalg.svd非常容易。这是一个简单的演示:

import numpy as np
import matplotlib.pyplot as plt
from scipy.misc import lena

# the underlying signal is a sinusoidally modulated image
img = lena()
t = np.arange(100)
time = np.sin(0.1*t)
real = time[:,np.newaxis,np.newaxis] * img[np.newaxis,...]

# we add some noise
noisy = real + np.random.randn(*real.shape)*255

# (observations, features) matrix
M = noisy.reshape(noisy.shape[0],-1)

# singular value decomposition factorises your data matrix such that:
# 
#   M = U*S*V.T     (where '*' is matrix multiplication)
# 
# * U and V are the singular matrices, containing orthogonal vectors of
#   unit length in their rows and columns respectively.
#
# * S is a diagonal matrix containing the singular values of M - these 
#   values squared divided by the number of observations will give the 
#   variance explained by each PC.
#
# * if M is considered to be an (observations, features) matrix, the PCs
#   themselves would correspond to the rows of S^(1/2)*V.T. if M is 
#   (features, observations) then the PCs would be the columns of
#   U*S^(1/2).
#
# * since U and V both contain orthonormal vectors, U*V.T is equivalent 
#   to a whitened version of M.

U, s, Vt = np.linalg.svd(M, full_matrices=False)
V = Vt.T

# PCs are already sorted by descending order 
# of the singular values (i.e. by the
# proportion of total variance they explain)

# if we use all of the PCs we can reconstruct the noisy signal perfectly
S = np.diag(s)
Mhat = np.dot(U, np.dot(S, V.T))
print "Using all PCs, MSE = %.6G" %(np.mean((M - Mhat)**2))

# if we use only the first 20 PCs the reconstruction is less accurate
Mhat2 = np.dot(U[:, :20], np.dot(S[:20, :20], V[:,:20].T))
print "Using first 20 PCs, MSE = %.6G" %(np.mean((M - Mhat2)**2))

fig, [ax1, ax2, ax3] = plt.subplots(1, 3)
ax1.imshow(img)
ax1.set_title('true image')
ax2.imshow(noisy.mean(0))
ax2.set_title('mean of noisy images')
ax3.imshow((s[0]**(1./2) * V[:,0]).reshape(img.shape))
ax3.set_title('first spatial PC')
plt.show()

PCA using numpy.linalg.svd is super easy. Here’s a simple demo:

import numpy as np
import matplotlib.pyplot as plt
from scipy.misc import lena

# the underlying signal is a sinusoidally modulated image
img = lena()
t = np.arange(100)
time = np.sin(0.1*t)
real = time[:,np.newaxis,np.newaxis] * img[np.newaxis,...]

# we add some noise
noisy = real + np.random.randn(*real.shape)*255

# (observations, features) matrix
M = noisy.reshape(noisy.shape[0],-1)

# singular value decomposition factorises your data matrix such that:
# 
#   M = U*S*V.T     (where '*' is matrix multiplication)
# 
# * U and V are the singular matrices, containing orthogonal vectors of
#   unit length in their rows and columns respectively.
#
# * S is a diagonal matrix containing the singular values of M - these 
#   values squared divided by the number of observations will give the 
#   variance explained by each PC.
#
# * if M is considered to be an (observations, features) matrix, the PCs
#   themselves would correspond to the rows of S^(1/2)*V.T. if M is 
#   (features, observations) then the PCs would be the columns of
#   U*S^(1/2).
#
# * since U and V both contain orthonormal vectors, U*V.T is equivalent 
#   to a whitened version of M.

U, s, Vt = np.linalg.svd(M, full_matrices=False)
V = Vt.T

# PCs are already sorted by descending order 
# of the singular values (i.e. by the
# proportion of total variance they explain)

# if we use all of the PCs we can reconstruct the noisy signal perfectly
S = np.diag(s)
Mhat = np.dot(U, np.dot(S, V.T))
print "Using all PCs, MSE = %.6G" %(np.mean((M - Mhat)**2))

# if we use only the first 20 PCs the reconstruction is less accurate
Mhat2 = np.dot(U[:, :20], np.dot(S[:20, :20], V[:,:20].T))
print "Using first 20 PCs, MSE = %.6G" %(np.mean((M - Mhat2)**2))

fig, [ax1, ax2, ax3] = plt.subplots(1, 3)
ax1.imshow(img)
ax1.set_title('true image')
ax2.imshow(noisy.mean(0))
ax2.set_title('mean of noisy images')
ax3.imshow((s[0]**(1./2) * V[:,0]).reshape(img.shape))
ax3.set_title('first spatial PC')
plt.show()

回答 3

您可以使用sklearn:

import sklearn.decomposition as deco
import numpy as np

x = (x - np.mean(x, 0)) / np.std(x, 0) # You need to normalize your data first
pca = deco.PCA(n_components) # n_components is the components number after reduction
x_r = pca.fit(x).transform(x)
print ('explained variance (first %d components): %.2f'%(n_components, sum(pca.explained_variance_ratio_)))

You can use sklearn:

import sklearn.decomposition as deco
import numpy as np

x = (x - np.mean(x, 0)) / np.std(x, 0) # You need to normalize your data first
pca = deco.PCA(n_components) # n_components is the components number after reduction
x_r = pca.fit(x).transform(x)
print ('explained variance (first %d components): %.2f'%(n_components, sum(pca.explained_variance_ratio_)))

回答 4


回答 5

SVD应该可以在460尺寸上正常工作。在我的Atom上网本上大约需要7秒钟。eig()方法花费更多的时间(它应该使用更多的浮点运算),并且几乎总是精度较低。

如果您的示例少于460个,则您要对角化散布矩阵(x-datamean)^ T(x-mean),假设您的数据点为列,然后向左乘以(x-datamean)。如果您的维数多于数据,那可能会更快。

SVD should work fine with 460 dimensions. It takes about 7 seconds on my Atom netbook. The eig() method takes more time (as it should, it uses more floating point operations) and will almost always be less accurate.

If you have less than 460 examples then what you want to do is diagonalize the scatter matrix (x – datamean)^T(x – mean), assuming your data points are columns, and then left-multiplying by (x – datamean). That might be faster in the case where you have more dimensions than data.


回答 6

您可以很容易地使用scipy.linalg(假设预先居中的数据集data)“滚动”自己的数据:

covmat = data.dot(data.T)
evs, evmat = scipy.linalg.eig(covmat)

然后evs是您的特征值,evmat就是您的投影矩阵。

如果要保留d尺寸,请使用第一个d特征值和第一个d特征向量。

假设scipy.linalg具有分解和numpy个矩阵乘法,您还需要什么?

You can quite easily “roll” your own using scipy.linalg (assuming a pre-centered dataset data):

covmat = data.dot(data.T)
evs, evmat = scipy.linalg.eig(covmat)

Then evs are your eigenvalues, and evmat is your projection matrix.

If you want to keep d dimensions, use the first d eigenvalues and first d eigenvectors.

Given that scipy.linalg has the decomposition and numpy the matrix multiplications, what else do you need?


回答 7

我刚读完《机器学习:算法观点》一书。本书中的所有代码示例都是由Python(以及几乎所有的Nu​​mpy)编写的。chatper10.2主成分分析的代码片段可能值得一读。它使用numpy.linalg.eig。
顺便说一句,我认为SVD可以很好地处理460 * 460尺寸。我已经在一个非常旧的PC:Pentium III 733mHz上使用numpy / scipy.linalg.svd计算出6500 * 6500 SVD。老实说,脚本需要大量内存(约1.xG)和大量时间(约30分钟)才能获得SVD结果。但是我认为,除非您需要大量执行SVD,否则现代PC上的460 * 460并不是什么大问题。

I just finish reading the book Machine Learning: An Algorithmic Perspective. All code examples in the book was written by Python(and almost with Numpy). The code snippet of chatper10.2 Principal Components Analysis maybe worth a reading. It use numpy.linalg.eig.
By the way, I think SVD can handle 460 * 460 dimensions very well. I have calculate a 6500*6500 SVD with numpy/scipy.linalg.svd on a very old PC:Pentium III 733mHz. To be honest, the script needs a lot of memory(about 1.xG) and a lot of time(about 30 minutes) to get the SVD result. But I think 460*460 on a modern PC will not be a big problem unless u need do SVD a huge number of times.


回答 8

您不需要完全奇异值分解(SVD),因为它可以计算所有特征值和特征向量,并且对于大型矩阵可能是禁止的。 scipy及其稀疏模块提供了适用于稀疏和密集矩阵的通用线性代数函数,其中包括eig *系列函数:

http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html#matrix-factorizations

Scikit-learn提供了Python PCA实现,目前仅支持密集矩阵。

时间:

In [1]: A = np.random.randn(1000, 1000)

In [2]: %timeit scipy.sparse.linalg.eigsh(A)
1 loops, best of 3: 802 ms per loop

In [3]: %timeit np.linalg.svd(A)
1 loops, best of 3: 5.91 s per loop

You do not need full Singular Value Decomposition (SVD) at it computes all eigenvalues and eigenvectors and can be prohibitive for large matrices. scipy and its sparse module provide generic linear algrebra functions working on both sparse and dense matrices, among which there is the eig* family of functions :

http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html#matrix-factorizations

Scikit-learn provides a Python PCA implementation which only support dense matrices for now.

Timings :

In [1]: A = np.random.randn(1000, 1000)

In [2]: %timeit scipy.sparse.linalg.eigsh(A)
1 loops, best of 3: 802 ms per loop

In [3]: %timeit np.linalg.svd(A)
1 loops, best of 3: 5.91 s per loop

回答 9

是使用numpy,scipy和C扩展名的python PCA模块的另一种实现。该模块使用SVD或在C中实现的NIPALS(非线性迭代部分最小二乘)算法执行PCA。

Here is another implementation of a PCA module for python using numpy, scipy and C-extensions. The module carries out PCA using either a SVD or the NIPALS (Nonlinear Iterative Partial Least Squares) algorithm which is implemented in C.


回答 10

如果您正在使用3D向量,则可以使用toolbelt vg简洁地应用SVD 。它是numpy之上的一个浅层。

import numpy as np
import vg

vg.principal_components(data)

如果只需要第一个主成分,则还有一个方便的别名:

vg.major_axis(data)

我在上次启动时创建了该库,其灵感来自于以下用途:在NumPy中冗长或不透明的简单想法。

If you’re working with 3D vectors, you can apply SVD concisely using the toolbelt vg. It’s a light layer on top of numpy.

import numpy as np
import vg

vg.principal_components(data)

There’s also a convenient alias if you only want the first principal component:

vg.major_axis(data)

I created the library at my last startup, where it was motivated by uses like this: simple ideas which are verbose or opaque in NumPy.


AiLearning-AiLearning:机器学习-MachineLearning-ML、深度学习-DeepLearning-DL、自然语言处理nlp

网站地址

下载

Docker

docker pull apachecn0/ailearning
docker run -tid -p <port>:80 apachecn0/ailearning
# 访问 http://localhost:{port} 查看文档

PYPI

pip install apachecn-ailearning
apachecn-ailearning <port>
# 访问 http://localhost:{port} 查看文档

NPM

npm install -g ailearning
ailearning <port>
# 访问 http://localhost:{port} 查看文档

组织介绍

  • 合作或侵权,请联系:apachecn@163.com
  • 我们不是apache的官方组织/机构/团体,只是apache技术栈(以及AI)的爱好者!

一种新技术一旦开始流行,你要么坐上压路机,要么成为铺路石.–斯图尔特·布兰德(Stewart Brand)

路线图

补充

1.机器学习-基础

支持版本

版本 支持
3.6.x
2.7.x

注意事项:

  • 机器学习实战:仅仅只是学习,请使用Python 2.7.x版本(3.6.x只是修改了部分)

基本介绍

学习文档

模块 章节 类型 负责人(GiHub) QQ
机器学习实战 第 1 章: 机器学习基础 介绍 @毛红动 1306014226
机器学习实战 第 2 章: KNN 近邻算法 分类 @尤永江 279393323
机器学习实战 第 3 章: 决策树 分类 @景涛 844300439
机器学习实战 第 4 章: 朴素贝叶斯 分类 @wnma3mz
@分析
1003324213
244970749
机器学习实战 第 5 章: Logistic回归 分类 @微光同尘 529925688
机器学习实战 第 6 章: SVM 支持向量机 分类 @王德红 934969547
网上组合内容 第 7 章: 集成方法(随机森林和 AdaBoost) 分类 @片刻 529815144
机器学习实战 第 8 章: 回归 回归 @微光同尘 529925688
机器学习实战 第 9 章: 树回归 回归 @微光同尘 529925688
机器学习实战 第 10 章: K-Means 聚类 聚类 @徐昭清 827106588
机器学习实战 第 11 章: 利用 Apriori 算法进行关联分析 频繁项集 @刘海飞 1049498972
机器学习实战 第 12 章: FP-growth 高效发现频繁项集 频繁项集 @程威 842725815
机器学习实战 第 13 章: 利用 PCA 来简化数据 工具 @廖立娟 835670618
机器学习实战 第 14 章: 利用 SVD 来简化数据 工具 @张俊皓 714974242
机器学习实战 第 15 章: 大数据与 MapReduce 工具 @wnma3mz 1003324213
ml项目实战 第 16 章: 推荐系统(已迁移) 项目 推荐系统(迁移后地址)
第一期的总结 2017-04-08: 第一期的总结 总结 总结 529815144

网站视频

知乎问答-爆炸啦-机器学习该怎么入门?

当然我知道,第一句就会被吐槽,因为科班出身的人,不屑的吐了一口唾沫,说傻X,还评论Andrew Ng的视频.

我还知道还有一部分人,看Andrew Ng的视频就是看不懂,那神秘的数学推导,那迷之微笑的英文版的教学,我何尝又不是这样走过来的??我的心可能比你们都痛,因为我在网上收藏过上10部“机器学习”相关视频,外加国内本土风格的教程:7月+小象等等,我都很难去听懂,直到有一天,被一个百度的高级算法分析师推荐说:“机器学习实战”还不错,通俗易懂,你去试试??

我试了试,还好我的Python基础和调试能力还不错,基本上代码都调试过一遍,很多高大上的“理论+推导”,在我眼中变成了几个“加减乘除+循环”,我想这不就是像我这样的程序员想要的入门教程么?

很多程序员说机器学习TM太难学了,是的,真TM难学,我想最难的是:没有一本像“机器学习实战”那样的作者愿意以程序员Coding角度去给大家讲解!!

最近几天、GitHub涨了300颗STAR、加群的200人,现在还在不断的增加++,我想大家可能都是感同身受吧!

很多想入门新手就是被忽悠着收藏收藏再收藏,但是最后还是什么都没有学到,也就是“资源收藏家”,也许新手要的就是MachineLearning(机器学习) 学习路线图那就是。没错,我可以给你们的一份,因为我们还通过视频记录下来我们的学习过程.水平当然也有限,不过对于新手入门,绝对没问题,如果你还不会,那算我输!!

视频怎么看?

  1. 理论科班出身-建议去学习Andrew Ng的视频(Ng的视频绝对是权威,这个毋庸置疑)
  2. 编码能力强-建议看我们的《机器学习实战-教学版》
  3. 编码能力弱-建议看我们的《机器学习实战-讨论版》、不过在看理论的时候,看教学版-理论部分;讨论版的废话太多,不过在讲解代码的时候是一行一行讲解的;所以,根据自己的需求,自由的组合.

[免费]数学教学视频-可汗学院入门篇

概率 统计 线性代数
可汗学院(概率) 可汗学院(统计学) 可汗学院(线性代数)

机器学习视频-ApacheCN教学版

AcFun B站
优酷 网易云课堂

[免费]机器/深度学习视频-吴恩达

机器学习 深度学习
吴恩达机器学习 神经网络和深度学习

2.深度学习

支持版本

版本 支持
3.6.x
2.7.x

入门基础

  1. 反向传递https://www.cnblogs.com/charlotte77/p/5629865.html
  2. CNN原理http://www.cnblogs.com/charlotte77/p/7759802.html
  3. RNN原理https://blog.csdn.net/qq_39422642/article/details/78676567
  4. LSTM原理https://blog.csdn.net/weixin_42111770/article/details/80900575

火炬-教程

–待更新

TensorFlow2.0-教程

–待更新

目录结构:

(切分(分词)

词性标注

命名实体识别

句法分析

wordnet可以被看作是一个同义词词典

词干提取(词干)与词形还原(词汇化)

TensorFlow2.0学习网址

3.自然语言处理

支持版本

版本 支持
3.6.x
2.7.x

学习过程中-内心复杂的变化!

自从学习NLP以后,才发现国内与国外的典型区别:
1. 对资源的态度是完全相反的:
  1) 国内: 就好像为了名气,举办工作装逼的会议,就是没有干货,全部都是象征性的PPT介绍,不是针对在做的各位
  2)国外: 就好像是为了推动nlp进步一样,分享者各种干货资料和具体的实现。(特别是: python自然语言处理)
2. 论文的实现: 
  1) 各种高大上的论文实现,却还是没看到一个像样的GitHub项目!(可能我的搜索能力差了点,一直没找到)
  2)国外就不举例了,我看不懂!
3. 开源的框架
  1)国外的开源框架:  tensorflow/pytorch 文档+教程+视频(官方提供)
  2) 国内的开源框架: 额额,还真举例不出来!但是牛逼吹得不比国外差!(MXNet虽然有众多国人参与开发,但不能算是国内开源框架。基于MXNet的动手学深度学习(http://zh.d2l.ai & https://discuss.gluon.ai/t/topic/753)中文教程,已经由沐神(李沐)以及阿斯顿·张讲授录制,公开发布(文档+第一季教程+视频)。)
每一次深入都要去翻墙,每一次深入都要Google,每一次看着国内的说: 哈工大、讯飞、中科大、百度、阿里多牛逼,但是资料还是得国外去找!
有时候真的挺恨的!真的有点瞧不起自己国内的技术环境!

当然谢谢国内很多博客大佬,特别是一些入门的Demo和基本概念。【深入的水平有限,没看懂】

1.(使用场景(百度公开课)

第一部分入门介绍

第二部分机器翻译

第三部分篇章分析

第四部分单元-语言理解与交互技术

应用领域

中文分词:

  • 构建DAG图
  • 动态规划查找,综合正反向(正向加权反向输出)求得DAG最大概率路径
  • 使用了SBME语料训练了一套HMM+维特比模型,解决未登录词问题

1.文本分类(文本分类)

文本分类是指标记句子或文档,例如电子邮件垃圾邮件分类和情感分析.

下面是一些很好的初学者文本分类数据集.

  1. 路透社Newswire主题分类(路透社-21578)。1987年年路透社出现的一系列新闻文件,按类别编制索引。另见RCV1,RCV2和TRC2那就是。
  2. IMDB电影评论情感分类(斯坦福)那就是。来自网站imdb.com的一系列电影评论及其积极或消极的情绪。
  3. 新闻组电影评论情感分类(康奈尔)那就是。来自网站imdb.com的一系列电影评论及其积极或消极的情绪。

有关更多信息,请参阅帖子:单标签文本分类的数据集那就是。

情感分析

比赛地址:https://www.kaggle.com/c/word2vec-nlp-tutorial

  • 方案一(0.86):字数+朴素贝叶斯
  • 方案二(0.94):lda+分类模型(knn/决策树/逻辑回归/svm/xgBoost/随机森林)
    • a)决策树效果不是很好,这种连续特征不太适合的
    • b)通过参数调整200年个主题,信息量保存效果较优(计算主题)
  • 美国有线电视新闻网(方案三):word2vec+cnn
    • 说实话:没有一个好的机器,是调不出来一个好的结果(:逃

通过AuC来评估模型的效果

2.语言模型(语言建模)

语言建模涉及开发一种统计模型,用于预测句子中的下一个单词或一个单词中的下一个单词.它是语音识别和机器翻译等任务中的前置任务.

它是语音识别和机器翻译等任务中的前置任务.

下面是一些很好的初学者语言建模数据集.

  1. 古腾堡项目、一系列免费书籍,可以用纯文本检索各种语言.
  2. 还有更多正式的语料库得到了很好的研究;例如:布朗大学现代美国英语标准语料库那就是。大量英语单词样本.谷歌10亿字语料库那就是。

新词发现

句子相似度识别

文本纠错

  • 双字母+双音

3.图像字幕(图像字幕)

法师字幕是为给定图像生成文本描述的任务。

下面是一些很好的初学者图像字幕数据集.

  1. 上下文中的公共对象(COCO)那就是。包含超过12万张带描述的图像的集合
  2. Flickr 8K那就是。从Flickr.com获取的8千个描述图像的集合。
  3. Flickr 30K那就是。从Flickr.com获取的3万个描述图像的集合。欲了解更多,请看帖子:

探索图像字幕数据集,2016年

4.机器翻译(机器翻译)

机器翻译是将文本从一种语言翻译成另一种语言的任务.

下面是一些很好的初学者机器翻译数据集.

  1. 加拿大第36届议会的协调国会议员那就是。成对的英语和法语句子.
  2. 欧洲议会诉讼平行语料库1996-2011那就是。句子对一套欧洲语言.有大量标准数据集用于年度机器翻译挑战;看到:

统计机器翻译

机器翻译

5.问答系统(问答)

问答是一项任务,其中提供了一个句子或文本样本,从中提出问题并且必须回答问题.

下面是一些很好的初学者问题回答数据集.

  1. 斯坦福问题回答数据集(SQuAD)那就是。回答有关维基百科文章的问题.
  2. Deepmind问题回答语料库那就是。从每日邮报回答有关新闻文章的问题.
  3. 亚马逊问答数据那就是。回答有关亚马逊产品的问题.有关更多信息,请参阅帖子:

数据集: 我如何获得问答网站的语料库,如Quora或Yahoo Answers或Stack Overflow来分析答案质量?

6.语音识别(语音识别)

语音识别是将口语的音频转换为人类可读文本的任务.

下面是一些很好的初学者语音识别数据集.

  1. TIMIT声学 – 语音连续语音语料库那就是。不是免费的,但因其广泛使用而上市.口语美国英语和相关的转录.
  2. VoxForge那就是。用于构建用于语音识别的开源数据库的项目.
  3. LibriSpeech ASR语料库那就是。从librivox收集的大量英语有声读物.

7.自动文摘(文档摘要)

文档摘要是创建较大文档的简短有意义描述的任务.

下面是一些很好的初学者文档摘要数据集.

  1. 法律案例报告数据集那就是。收集了4000份法律案件及其摘要。
  2. TIPSTER文本摘要评估会议语料库那就是。收集了近200份文件及其摘要。
  3. 英语新闻文本的AQUAINT语料库那就是。不是免费的,而是广泛使用的.新闻文章的语料库.欲了解更多信息:

文档理解会议(DUC)任务那就是。在哪里可以找到用于文本摘要的良好数据集?

命名实体识别

文本摘要

图形图计算[慢慢更新]

  • 数据集:data/nlp/graph
  • 学习资料:电光图片X实战.pdf[文件太大不方便提供,自己百度]

知识图谱

进一步阅读

如果您希望更深入,本节提供了其他数据集列表.

  1. 维基百科研究中使用的文本数据集
  2. 数据集: 计算语言学家和自然语言处理研究人员使用的主要文本语料库是什么?
  3. 斯坦福统计自然语言处理语料库
  4. 按字母顺序排列的NLP数据集列表
  5. 该机构NLTK
  6. 在DL4J上打开深度学习数据
  7. NLP数据集
  8. 国内开放数据集:https://bosonnlp.com/dev/resource

贡献者信息

欢迎贡献者不断的追加

免责声明-[只供学习参考]

  • ApacheCN纯粹出于学习目的与个人兴趣翻译本书
  • ApacheCN保留对此版本译文的署名权及其它相关权利

协议

  • 以各项目协议为准.
  • ApacheCN账号下没有协议的项目,一律视为CC BY-NC-SA 4.0那就是。

资料来源:

感谢信

最近无意收到群友推送的链接,发现得到大佬高度的认可,并在热心的推广

在此感谢:

赞助我们