পাইথনে প্রধান উপাদান বিশ্লেষণ


112

মাত্রিকতা হ্রাসের জন্য আমি মূল উপাদান বিশ্লেষণ (পিসিএ) ব্যবহার করতে চাই। ইতোমধ্যে ন্পী বা স্কিপি রয়েছে, বা আমার নিজের ব্যবহারটি রোল করতে হবে numpy.linalg.eigh?

আমি কেবল একক মানের মূল্য পচন (এসভিডি) ব্যবহার করতে চাই না কারণ আমার ইনপুট ডেটাটি বেশ উচ্চ মাত্রার (60 460 মাত্রা), তাই আমি মনে করি এসভিডি কোভারিয়েন্স ম্যাট্রিক্সের ইগেনভেেক্টরগুলিকে গণনা করার চেয়ে ধীর করবে।

আমি একটি প্রাক তৈরি, ডিবাগড বাস্তবায়ন খুঁজে পাওয়ার আশা করছিলাম যা কোন পদ্ধতিটি কখন ব্যবহার করতে হবে এবং যেটি অন্যান্য অপ্টিমাইজেশন সম্পর্কে আমি জানিনা সে সম্পর্কে ইতিমধ্যে সঠিক সিদ্ধান্ত নিয়েছে।

উত্তর:


28

আপনার এমডিপিতে এক নজর থাকতে পারে ।

আমি নিজে এটি পরীক্ষা করার সুযোগ পাইনি, তবে আমি এটি পিসিএ কার্যকারিতার জন্য বুকমার্ক করেছি।


8
এমডিপি 2012 সাল থেকে রক্ষণাবেক্ষণ করা হয়নি, সেরা সমাধানের মতো দেখায় না।
মার্ক গার্সিয়া

সর্বশেষ আপডেটটি 09.03.2016 এর, তবে মনে রাখবেন যে কেবলমাত্র বাগ-ফিক্স রিলিজ:Note that from this release MDP is in maintenance mode. 13 years after its first public release, MDP has reached full maturity and no new features are planned in the future.
গ্যাব্রিয়েল

65

মাস কয়েক পরে, এখানে একটি ছোট শ্রেণির পিসিএ এবং একটি চিত্র:

#!/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

এখানে চিত্র বর্ণনা লিখুন


3
Fyinfo, সেখানে একটি চমৎকার আলাপ এর শক্তসমর্থ পিসিএ সি Caramanis জানুয়ারি 2011 দ্বারা
ডেনিস

এই কোডটি কি সেই চিত্রটি আউটপুট দেবে (আইরিস পিসিএ)? যদি তা না হয় তবে আপনি কী কোনও বিকল্প সমাধান পোস্ট করতে পারেন যাতে সেই চিত্রটিই বেরিয়ে আসে। এই কোডটি সি ++ এ রূপান্তর করতে আইএম কিছু অসুবিধা করছেন কারণ আমি
অজগরটিতে

44

পিসিএ ব্যবহার 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()

2
আমি বুঝতে পারি যে আমি এখানে একটু দেরি করেছি, তবে ওপি বিশেষত এমন একটি সমাধানের জন্য অনুরোধ করেছে যা একক মানের পচন এড়ানো যায়।
অ্যালেক্স এ।

1
@ অ্যালেক্স আমি বুঝতে পারি, তবে আমি নিশ্চিত যে এসভিডি এখনও সঠিক পন্থা। এটি ওপি-র প্রয়োজনের জন্য খুব দ্রুত হওয়া উচিত (আমার উদাহরণের উপরে, ২২২২৪৪ মাত্রাগুলি একটি সাধারণ ল্যাপটপে মাত্র ~ ~.৫ সেকেন্ড নেয়), এবং এটি আইজেন্ডেকম্পোশন পদ্ধতির তুলনায় আরও বেশি সংখ্যায় স্থিতিশীল (নীচে dwf এর মন্তব্য দেখুন)। আমি এটিও নোট করি যে গৃহীত উত্তরগুলি এসভিডিও ব্যবহার করে!
ali_m

আমি একমত নই যে এসভিডি যাওয়ার উপায়, আমি কেবল বলছিলাম যে উত্তরটি প্রশ্নের উত্তর হিসাবে প্রশ্নটিকে সম্বোধন করে না। এটি একটি দুর্দান্ত উত্তর, যদিও, দুর্দান্ত কাজ।
অ্যালেক্স এ।

5
@ অ্যালেক্স মেলা যথেষ্ট। আমি মনে করি এটি এক্সওয়াই সমস্যার অন্য রূপ - ওপি বলেছে যে সে এসভিডি-ভিত্তিক সমাধান চায় না কারণ তিনি ভেবেছিলেন যে এসভিডি খুব ধীর হবে, সম্ভবত এটি চেষ্টা না করেই। এর মতো ক্ষেত্রে আমি ব্যক্তিগতভাবে মনে করি যে আপনি কীভাবে আরও বিস্তৃত সমস্যা মোকাবেলা করবেন তা ব্যাখ্যা করার জন্য এটি আরও সহায়ক, প্রশ্নটির মূল, সংকীর্ণ আকারে ঠিক উত্তর দেওয়ার চেয়ে।
ali_m

svdsডকুমেন্টেশন যতদূর অবতরণ ক্রমে সাজানো হিসাবে ইতিমধ্যে ফিরে আসে । (সম্ভবত এটি ২০১২ সালে ছিল না, তবে আজকের দিনেও রয়েছে)
ইটিয়েন ব্রুইনস

34

আপনি স্কলারন ব্যবহার করতে পারেন:

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_)))

উত্সাহিত কারণ এটি আমার পক্ষে সুন্দরভাবে কাজ করে - আমার কাছে 460 টিরও বেশি মাত্রা রয়েছে এবং যদিও স্ক্লার্ন এসভিডি ব্যবহার করে এবং প্রশ্নটি নন-এসভিডি-র অনুরোধ করে, আমি মনে করি 460 মাত্রা ঠিক আছে।
ড্যান স্টোভেল

আপনি একটি ধ্রুবক মান (স্ট্যান্ড = 0) সহ কলামগুলিও মুছে ফেলতে চাইতে পারেন। তার জন্য আপনার ব্যবহার করা উচিত: অপসারণ_কোলস = এনপি.হোয়ার (এনপি.ল (এক্স == এনপি.মিয়ান (x, 0), 0)) [0] এবং তারপরে x = np.delete (x, সরানো_কোলো, 1)
নোম Peled

31

5
ম্যাটপ্ল্লোলিবের পিসিএর লিঙ্কটি আপডেট হয়েছে।
বিকাশকারী

3
পিসিএর ম্যাটপ্লটলিব.ম্ল্যাব বাস্তবায়ন এসভিডি ব্যবহার করে।
আমান

3
এর কার্যকারিতা এবং কীভাবে ব্যবহার করতে হয় তার আরও বিশদ বিবরণ এখানে ।
দোলন অ্যান্টিনিচি

14

এসভিডি 460 মাত্রা সহ সূক্ষ্মভাবে কাজ করা উচিত। এটি আমার অ্যাটম নেটবুকটিতে প্রায় 7 সেকেন্ড সময় নেয়। Eig () পদ্ধতিতে আরও সময় লাগে (যেমন এটি হওয়া উচিত, এটি আরও বেশি ভাসমান পয়েন্ট অপারেশন ব্যবহার করে) এবং প্রায় সর্বদা কম নির্ভুল হবে।

আপনার যদি 460 টিরও কম উদাহরণ থাকে তবে আপনি যা করতে চান তা হ'ল স্ক্যাটার ম্যাট্রিক্স (x - ডেটামিন) ^ টি (x - গড়), ধরে নিবেন আপনার ডেটা পয়েন্টগুলি কলাম, এবং তারপরে বাম-গুণ দ্বারা (x - ডাটামিন) দ্বারা গুণমান। যে পারে দ্রুততর ক্ষেত্রে যেখানে আপনি ডাটা চেয়ে বেশি মাত্রার আছে হও।


যখন আপনার কাছে তথ্যের চেয়ে আরও বেশি মাত্রা থাকে আপনি কি এই কৌশলটি আরও বিশদে বর্ণনা করতে পারেন?
mrgloom

1
মূলত আপনি ধরে নিলেন যে ইগেনভেেক্টরগুলি ডেটা ভেক্টরের লিনিয়ার সংমিশ্রণ। সিরোভিচ (1987) দেখুন। "অশান্তি এবং সুসংগত কাঠামোর গতিশীলতা।"
dwf

11

আপনি সহজেই নিজের নিজস্ব ব্যবহার করে "রোল" করতে পারেন scipy.linalg(প্রাক-কেন্দ্রিক ডেটাসেট ধরে রেখে data):

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

তারপরে evsআপনার ইগেনভ্যালুগুলি evmatহ'ল এবং এটি আপনার প্রোজেকশন ম্যাট্রিক্স।

আপনি যদি dমাত্রা রাখতে চান তবে প্রথম dইগেনভ্যালু এবং প্রথম dইগেনভেেক্টর ব্যবহার করুন ।

প্রদত্ত যে scipy.linalgপচানি এবং ম্যাট্রিক্স multiplications numpy, তুমি আর কি প্রয়োজন?


কোভ ম্যাট্রিক্স হল এনপি.ডট (ডেটা.টি, ডেটা, আউট = কোভ্যাট), যেখানে ডেটা কেন্দ্রিক ম্যাট্রিক্স হওয়া উচিত।
mrgloom

2
কোভারিয়েন্স ম্যাট্রিক্স ব্যবহারের ঝুঁকির জন্য আপনার এই উত্তরটিতে @ ডিডাব্লুএফ এর মন্তব্যটি একবার দেখে নেওয়া উচিত eig()
অ্যালেক্স এ

8

আমি কেবল মেশিন লার্নিং বইটি পড়ে শেষ করেছি : একটি অ্যালগরিদমিক দৃষ্টিভঙ্গি । বইয়ের সমস্ত কোড উদাহরণ পাইথন দ্বারা লিখেছিলেন (এবং প্রায় নম্পি সহ)। চ্যাটার 10.2 কোডের স্নিপেটটি মূল উপাদানগুলির বিশ্লেষণের জন্য সম্ভবত পড়ার উপযুক্ত। এটি numpy.linalg.eig ব্যবহার করে।
যাইহোক, আমি মনে করি এসভিডি 460 * 460 মাত্রা খুব ভালভাবে পরিচালনা করতে পারে। আমি খুব পুরানো পিসিতে নাম্পি / স্কিপি.লিনালগ.এসভিডি সহ 6500 * 6500 এসভিডি গণনা করেছি: পেন্টিয়াম তৃতীয় 733mHz। সত্যি কথা বলতে, স্ক্রিপ্টের এসভিডি ফলাফল পেতে প্রচুর মেমরি (প্রায় 1.xG) এবং প্রচুর সময় (প্রায় 30 মিনিট) প্রয়োজন। তবে আমি মনে করি একটি আধুনিক পিসিতে 460 * 460 একটি বড় সমস্যা হবে না যতক্ষণ না আপনার এসভিডি বিপুল সংখ্যক বার প্রয়োজন হয়।


28
যখন আপনি কেবল এসভিডি () ব্যবহার করতে পারেন তখন কোনও কোভারিয়ান্স ম্যাট্রিক্সে আপনাকে আইিগ () ব্যবহার করা উচিত নয়। আপনি কতগুলি উপাদান ব্যবহার এবং আপনার ডেটা ম্যাট্রিক্সের আকারের উপর নির্ভর করে প্রাক্তন দ্বারা প্রবর্তিত সংখ্যাসূচক ত্রুটি (এটি আরও ভাসমান পয়েন্ট অপারেশন করে) তাৎপর্যপূর্ণ হতে পারে। একই কারণে আপনি কখনই ইনভ () দ্বারা ম্যাট্রিক্সকে স্পষ্টভাবে উল্টাতে পারবেন না যদি আপনি যা আগ্রহী হন তার বিপরীত সময় কোনও ভেক্টর বা ম্যাট্রিক্স হয়; পরিবর্তে আপনার সমাধান () ব্যবহার করা উচিত।
dwf

5

আপনার সম্পূর্ণ সিগুলার মান পচন (এসভিডি) লাগবে না এটিতে সমস্ত ইগেনভ্যালু এবং আইজেনভেেক্টরকে গণনা করে এবং বড় ম্যাট্রিকের জন্য এটি প্রতিরোধমূলক হতে পারে। স্কিপি এবং এর স্পার্স মডিউল জেনেরিক লিনিয়ার আলগ্রেব্রা ফাংশন সরবরাহ করে যা উভয় স্পার্স এবং ঘন ম্যাট্রিকগুলিতে কাজ করে, যার মধ্যে ফাংশনগুলির eig * পরিবার রয়েছে:

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

সাইকিট-লার একটি পাইথন পিসিএ বাস্তবায়ন সরবরাহ করে যা কেবলমাত্র এখনকার জন্য ঘন ম্যাট্রিক্সকে সমর্থন করে।

সময়:

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

1
সত্যিই ন্যায্য তুলনা নয়, যেহেতু আপনাকে এখনও সমবায় ম্যাট্রিক্স গণনা করতে হবে। এছাড়াও খুব বড় ম্যাট্রিক্সের জন্য স্পার্স লিনালগ স্টাফগুলি ব্যবহার করা কেবলমাত্র মূল্যবান, কারণ ঘন ম্যাট্রিক্স থেকে স্পার্স ম্যাট্রিক্সগুলি নির্মাণ করা বেশ ধীর বলে মনে হয়। উদাহরণস্বরূপ, ননস্পার্স ম্যাট্রিক্সের eigshতুলনায় আসলে eighx 4x কম । scipy.sparse.linalg.svdsবনাম জন্য একই numpy.linalg.svd। @ ডাব্লুএফ উল্লেখ করেছেন যে কারণে আমি সবসময় এসভিডি-এর সাথে ইজেনভ্যালু পচন ধরে যাব এবং যদি ম্যাট্রিকগুলি সত্যিই বিশাল আকার ধারণ করে তবে সম্ভবত এসভিডি-এর বিচ্ছিন্ন সংস্করণ ব্যবহার করব।
ali_m

2
ঘন ম্যাট্রিক্স থেকে আপনাকে স্পার্স ম্যাট্রিকগুলি গণনা করার দরকার নেই। স্পার্স.লিনালগ মডিউলে প্রদত্ত অ্যালগরিদমগুলি কেবল অপারেটর অবজেক্টের ম্যাটভেক পদ্ধতির মাধ্যমে ম্যাট্রিস ভেক্টর গুণমান ক্রিয়ায় নির্ভর করে। ঘন ম্যাট্রিক্সের জন্য এটি ম্যাটভেক = ডট (এ, এক্স) এর মতো কিছু। একই কারণে, আপনাকে কোভরিয়েন্স ম্যাট্রিক্স গণনা করার দরকার নেই কেবলমাত্র A. এর জন্য অপারেশন ডট (এটি, ডট (এ, এক্স)) সরবরাহের জন্য
নিকোলাস বারবে

আহ, এখন আমি দেখতে পাচ্ছি যে বিরল বনাম ননস্পার্স পদ্ধতির আপেক্ষিক গতি ম্যাট্রিক্সের আকারের উপর নির্ভর করে। যদি আমি আপনার উদাহরণ ব্যবহার যেখানে A একটি 1000 * 1000 ম্যাট্রিক্স তারপর eigshএবং svdsদ্রুত তুলনায় eighএবং svd~ 3 একটি গুণক দ্বারা, কিন্তু যদি একটি ছোট বলে 100 * 100, তারপর eighএবং svdযথাক্রমে ~ 4 কারণের এবং ~ 1.5 দ্বারা দ্রুততর হয় । টি বিচ্ছিন্ন ইগন্যাল্যুয়ু পচনের পরেও স্পার্স এসভিডি ব্যবহার করবে।
ali_m

2
আসলে, আমি মনে করি আমি বড় ম্যাট্রিক্সের প্রতি পক্ষপাতদুষ্ট। আমার কাছে বড় ম্যাট্রিকগুলি 1000 * 1000 এর চেয়ে 10⁶ * 10⁶ এর মতো। এই ক্ষেত্রে আপনি প্রায়শই সমবায় ম্যাট্রিকগুলিও সঞ্চয় করতে পারবেন না ...
নিকোলাস বারবে

4

অদ্ভুত, স্কিপি এবং সি-এক্সটেনশন ব্যবহার করে অজগরটির জন্য পিসিএ মডিউলের আরও একটি বাস্তবায়ন এখানে রয়েছে। মডিউলটি একটি এসভিডি বা এনআইপিএলএস (ননলাইনার আইট্রেটিভ আংশিক স্বল্প স্কোয়ারস) আলগোরিদিম ব্যবহার করে পিসিএ বহন করে যা সিতে প্রয়োগ করা হয় C.


0

যদি আপনার 3D ভেক্টর সঙ্গে কাজ করছেন, তাহলে আপনি সংক্ষেপে toolbelt ব্যবহার SVD আবেদন করতে পারেন VG । এটি নিমপির উপরে হালকা স্তর।

import numpy as np
import vg

vg.principal_components(data)

যদি আপনি কেবল প্রথম প্রধান উপাদানটি চান তবে একটি সুবিধাজনক উপনামও রয়েছে:

vg.major_axis(data)

আমি আমার শেষ প্রারম্ভের সময় লাইব্রেরিটি তৈরি করেছি, যেখানে এটি এই জাতীয় ব্যবহারের দ্বারা অনুপ্রাণিত হয়েছিল: সাধারণ ধারণা যা নুমপাইতে ভার্বোস বা অস্বচ্ছ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.