বিশাল সংখ্যক বৈশিষ্ট্যগুলির জন্য সেরা পিসিএ অ্যালগরিদম (> 10 কে)?


54

আমি এটি স্ট্যাকওভারফ্লোতে জিজ্ঞাসা করেছি, তবে এটি এসও-তে কোনও উত্তর না পেলে এটি এখানে আরও উপযুক্ত হতে পারে বলে মনে হয়। এটি পরিসংখ্যান এবং প্রোগ্রামিংয়ের ছেদ এ এক ধরণের।

আমার পিসিএ করার জন্য কিছু কোড লিখতে হবে (প্রিন্সিপাল কম্পোনেন্ট অ্যানালাইসিস)। আমি বিখ্যাত আলগোরিদিম মাধ্যমে ব্রাউজ এবং বাস্তবায়িত করেছি এই এক , যা যতটা আমি বলতে পারেন NIPALS অ্যালগরিদম দেওয়ার সমতুল্য। এটি প্রথম 2-3 মূল উপাদানগুলি সন্ধানের জন্য ভালভাবে কাজ করে তবে এটি রূপান্তর করতে খুব ধীর হয়ে গেছে বলে মনে হচ্ছে (কয়েক হাজার থেকে কয়েক হাজার পুনরাবৃত্তির ক্রম অনুসারে)। আমার যা প্রয়োজন তার বিশদ এখানে রইল:

  1. বিপুল সংখ্যক বৈশিষ্ট্য (10,000 থেকে 20,000 অর্ডার করুন) এবং কয়েকশ'র ক্রম অনুসারে নমুনা আকারের সাথে ডিল করার সময় অ্যালগরিদমটি দক্ষ হতে হবে।

  2. এটি অবশ্যই একটি শালীন লিনিয়ার বীজগণিত / ম্যাট্রিক্স লাইব্রেরি ব্যতীত যথাযথভাবে প্রয়োগযোগ্য হবে, কারণ লক্ষ্য ভাষাটি ডি, যার এখনও একটি নেই, এবং এটি থাকলেও, আমি এটিকে প্রকল্পে নির্ভরতা হিসাবে যুক্ত করতে পছন্দ করব না ।

পার্শ্ব নোট হিসাবে, একই ডেটাসেট আর-তে সমস্ত মূল উপাদানগুলি খুব দ্রুত খুঁজে পেয়েছে বলে মনে হয়, তবে এটি একক মানের পচন ব্যবহার করে, যা আমি নিজের কোড করতে চাই না।


2
প্রচুর পরিমাণে পাবলিক এসভিডি অ্যালগরিদম রয়েছে। এন.ইউইউইকিপিডিয়া.আরউইউ / দেখুন । আপনি কি তাদের একটির ব্যবহার বা মানিয়ে নিতে পারবেন না? এছাড়াও, আর ওপেন সোর্স, এবং একটি জিপিএল লাইসেন্সের অধীনে, সুতরাং যদি এটি কাজ করে তবে এর অ্যালগরিদমকে কেন ধার দেবেন না?
রব হ্যান্ডম্যান

@ রব: আমি কার্যত একটি লিনিয়ার বীজগণিত গ্রন্থাগার লেখা এড়াতে চাই এবং আমি জিপিএলের কপিলিফ্ট এড়াতে চাই want এছাড়াও, আমি এর আগে বি উত্স এবং আর উত্স কোডের টুকরা দেখেছি এবং এটি সাধারণত খুব পঠনযোগ্য নয়।
dsimcha

4
আমি কিছু অনুপস্থিত করছি? আপনার> 10 কে বৈশিষ্ট্য রয়েছে তবে <1K নমুনা রয়েছে? এর অর্থ সর্বশেষ 9 কে উপাদানগুলি নির্বিচারে। আপনি কি প্রথম উপাদানগুলির সমস্ত 1 কে চান?
shabbychef

2
যে কোনও ইভেন্টে, আপনি এসভিডি বাস্তবায়ন করে পালাতে পারবেন না, যদিও অনেক সংখ্যাগত লিনিয়ার বীজগণিত গবেষণার জন্য ধন্যবাদ, আপনার ম্যাট্রিক্সটি কত বড় / ছোট, স্পারস / ঘন উপর নির্ভর করে বাছাই করার জন্য এখন অনেকগুলি পদ্ধতি বেছে নেওয়া হয়েছে, বা যদি আপনি কেবলমাত্র একক মান, বা একক মানগুলির সম্পূর্ণ সেট এবং বাম / ডান একক ভেক্টর চান। অ্যালগরিদমগুলি আইএমএইচও বোঝা ভয়ঙ্কর নয়।
জেএম

আপনি আমাদের বলতে পারেন আপনি পিসিএ করতে চান কেন?
রবিন গিরার্ড

উত্তর:


27

আমি "হাল্কো, এন।, মার্টিনসন, পিজি, শোকলনিস্কি, ওয়াই, এবং টাইগার্ট, এম। (2010) তে বর্ণিত র্যান্ডমাইজড এসভিডি বাস্তবায়ন করেছি large বৃহত্তর ডেটা সেটের মূল উপাদান বিশ্লেষণের জন্য একটি অ্যালগরিদম Ar 1007.5510, 0526. http://arxiv.org/abs/1007.5510 থেকে 1 এপ্রিল, 2011-এ পুনরুদ্ধার করা হয়েছে । আপনি যদি কাটা কাটা এসভিডি পেতে চান, এটি সত্যই এমএটিএলবিএমে এসভিডি পরিবর্তনের চেয়ে অনেক বেশি দ্রুত কাজ করে। এটা আপনি এখানে পাবেন:

function [U,S,V] = fsvd(A, k, i, usePowerMethod)
% FSVD Fast Singular Value Decomposition 
% 
%   [U,S,V] = FSVD(A,k,i,usePowerMethod) computes the truncated singular
%   value decomposition of the input matrix A upto rank k using i levels of
%   Krylov method as given in [1], p. 3.
% 
%   If usePowerMethod is given as true, then only exponent i is used (i.e.
%   as power method). See [2] p.9, Randomized PCA algorithm for details.
% 
%   [1] Halko, N., Martinsson, P. G., Shkolnisky, Y., & Tygert, M. (2010).
%   An algorithm for the principal component analysis of large data sets.
%   Arxiv preprint arXiv:1007.5510, 0526. Retrieved April 1, 2011, from
%   http://arxiv.org/abs/1007.5510. 
%   
%   [2] Halko, N., Martinsson, P. G., & Tropp, J. A. (2009). Finding
%   structure with randomness: Probabilistic algorithms for constructing
%   approximate matrix decompositions. Arxiv preprint arXiv:0909.4061.
%   Retrieved April 1, 2011, from http://arxiv.org/abs/0909.4061.
% 
%   See also SVD.
% 
%   Copyright 2011 Ismail Ari, http://ismailari.com.

    if nargin < 3
        i = 1;
    end

    % Take (conjugate) transpose if necessary. It makes H smaller thus
    % leading the computations to be faster
    if size(A,1) < size(A,2)
        A = A';
        isTransposed = true;
    else
        isTransposed = false;
    end

    n = size(A,2);
    l = k + 2;

    % Form a real n×l matrix G whose entries are iid Gaussian r.v.s of zero
    % mean and unit variance
    G = randn(n,l);


    if nargin >= 4 && usePowerMethod
        % Use only the given exponent
        H = A*G;
        for j = 2:i+1
            H = A * (A'*H);
        end
    else
        % Compute the m×l matrices H^{(0)}, ..., H^{(i)}
        % Note that this is done implicitly in each iteration below.
        H = cell(1,i+1);
        H{1} = A*G;
        for j = 2:i+1
            H{j} = A * (A'*H{j-1});
        end

        % Form the m×((i+1)l) matrix H
        H = cell2mat(H);
    end

    % Using the pivoted QR-decomposiion, form a real m×((i+1)l) matrix Q
    % whose columns are orthonormal, s.t. there exists a real
    % ((i+1)l)×((i+1)l) matrix R for which H = QR.  
    % XXX: Buradaki column pivoting ile yapılmayan hali.
    [Q,~] = qr(H,0);

    % Compute the n×((i+1)l) product matrix T = A^T Q
    T = A'*Q;

    % Form an SVD of T
    [Vt, St, W] = svd(T,'econ');

    % Compute the m×((i+1)l) product matrix
    Ut = Q*W;

    % Retrieve the leftmost m×k block U of Ut, the leftmost n×k block V of
    % Vt, and the leftmost uppermost k×k block S of St. The product U S V^T
    % then approxiamtes A. 

    if isTransposed
        V = Ut(:,1:k);
        U = Vt(:,1:k);     
    else
        U = Ut(:,1:k);
        V = Vt(:,1:k);
    end
    S = St(1:k,1:k);
end

এটি পরীক্ষা করতে, কেবল একই ফোল্ডারে একটি চিত্র তৈরি করুন (ঠিক একটি বড় ম্যাট্রিক্স হিসাবে, আপনি নিজেরাই ম্যাট্রিক্স তৈরি করতে পারেন)

% Example code for fast SVD.

clc, clear

%% TRY ME
k = 10; % # dims
i = 2;  % # power
COMPUTE_SVD0 = true; % Comment out if you do not want to spend time with builtin SVD.

% A is the m×n matrix we want to decompose
A = im2double(rgb2gray(imread('test_image.jpg')))';

%% DO NOT MODIFY
if COMPUTE_SVD0
    tic
    % Compute SVD of A directly
    [U0, S0, V0] = svd(A,'econ');
    A0 = U0(:,1:k) * S0(1:k,1:k) * V0(:,1:k)';
    toc
    display(['SVD Error: ' num2str(compute_error(A,A0))])
    clear U0 S0 V0
end

% FSVD without power method
tic
[U1, S1, V1] = fsvd(A, k, i);
toc
A1 = U1 * S1 * V1';
display(['FSVD HYBRID Error: ' num2str(compute_error(A,A1))])
clear U1 S1 V1

% FSVD with power method
tic
[U2, S2, V2] = fsvd(A, k, i, true);
toc
A2 = U2 * S2 * V2';
display(['FSVD POWER Error: ' num2str(compute_error(A,A2))])
clear U2 S2 V2

subplot(2,2,1), imshow(A'), title('A (orig)')
if COMPUTE_SVD0, subplot(2,2,2), imshow(A0'), title('A0 (svd)'), end
subplot(2,2,3), imshow(A1'), title('A1 (fsvd hybrid)')
subplot(2,2,4), imshow(A2'), title('A2 (fsvd power)')

দ্রুত এসভিডি

আমি যখন এটি আমার ডেস্কটপে 635 * 483 আকারের চিত্রের জন্য চালনা করি তখন আমি পাই

Elapsed time is 0.110510 seconds.
SVD Error: 0.19132
Elapsed time is 0.017286 seconds.
FSVD HYBRID Error: 0.19142
Elapsed time is 0.006496 seconds.
FSVD POWER Error: 0.19206

আপনি দেখতে পাচ্ছেন, স্বল্প মানের জন্য kএটি মাতলাব এসভিডি ব্যবহারের চেয়ে 10 গুণ বেশি গতিযুক্ত। উপায় দ্বারা, আপনার পরীক্ষা ফাংশনটির জন্য নিম্নলিখিত সাধারণ ফাংশনটির প্রয়োজন হতে পারে:

function e = compute_error(A, B)
% COMPUTE_ERROR Compute relative error between two arrays

    e = norm(A(:)-B(:)) / norm(A(:));
end

আমি পিসিএ পদ্ধতি যুক্ত করিনি কারণ এটি এসভিডি ব্যবহার করে প্রয়োগ করা সোজা। তাদের সম্পর্কটি দেখতে আপনি এই লিঙ্কটি পরীক্ষা করতে পারেন।


12

আপনি কয়েকটি বিকল্প ব্যবহার করে চেষ্টা করতে পারেন।

1- পেনালাইজড ম্যাট্রিক্স পচন । কিছুটা স্পারসিটি পেতে আপনি ইউ এর জন্য কিছু দণ্ডিত সীমাবদ্ধতা প্রয়োগ করেছেন v জিনোমিক্স ডেটাতে ব্যবহৃত হয়েছে দ্রুত অ্যালগরিদম

হুইটেন তিবশিরানী দেখুন। তাদের একটি আর-পিকেজিও রয়েছে। "মূল উপাদান এবং ক্যানোনিকাল পারস্পরিক সম্পর্ক বিশ্লেষণের জন্য অ্যাপ্লিকেশন সহ একটি দন্ডিত ম্যাট্রিক্স পচন।"

2- র্যান্ডমাইজড এসভিডি । যেহেতু এসভিডি একটি মাস্টার অ্যালগরিদম, তাই খুব দ্রুত সান্নিধ্য লাভজনক হতে পারে, বিশেষত অনুসন্ধান বিশ্লেষণের জন্য। এলোমেলো এসভিডি ব্যবহার করে, আপনি বিশাল ডেটাসেটগুলিতে পিসিএ করতে পারেন।

মার্টিনসন, রখলিন এবং টাইগার্ট "ম্যাট্রিক্সের পচনের জন্য এলোমেলোভাবে অ্যালগরিদম" দেখুন। টাইগার্টের খুব দ্রুত পিসিএ প্রয়োগের কোড রয়েছে।

নীচে র মধ্যে এলোমেলো এসভিডি একটি সহজ বাস্তবায়ন।

ransvd = function(A, k=10, p=5) {
  n = nrow(A)
  y = A %*% matrix(rnorm(n * (k+p)), nrow=n)
  q = qr.Q(qr(y))
  b = t(q) %*% A
  svd = svd(b)
  list(u=q %*% svd$u, d=svd$d, v=svd$v)
}

দণ্ডিত ম্যাট্রিক্স পচানোর জন্য +1। সেই প্যাকেজটি বেশ আশ্চর্যজনক। আমার সম্ভবত এটি উল্লেখ করা উচিত যে এটি "উইটেন" এর বানান রয়েছে, যদিও লোকেরা উদ্ধৃতিটি খুঁজে পেতে সমস্যা হয়। শেষ অবধি, ওপি জানিয়েছিল যে তারা আর-তে কিছু লিখিত চায় না, তবে মূলত কোনও বৃহত এসভিডি প্যাকেজটির গতির জন্য সি, সি ++ বা ফোর্টরান ব্যাকএন্ড থাকবে।
ডেভিড জে হ্যারিস

4

মনে হচ্ছে আপনি ল্যাঙ্কজোস অ্যালগোরিদম ব্যবহার করতে চান । এটি ব্যর্থ হয়ে আপনি গোলব এবং ভ্যান anণের সাথে পরামর্শ করতে পারেন আমি একবার তাদের পাঠ্য থেকে একটি এসভিডি অ্যালগরিদম (সমস্ত ভাষার এসএমএল ভাষায়) কোড করেছি এবং এটি যুক্তিসঙ্গতভাবে ভালভাবে কাজ করেছে।


3

আমি কার্নেল পিসিএ চেষ্টা করার পরামর্শ দিচ্ছি যা সময়ের (স্পেস) জটিলতার সাথে উদাহরণগুলির সংখ্যার উপর নির্ভর করে (এন) বৈশিষ্ট্যগুলির চেয়ে বেশি (পি), যা আমি মনে করি আপনার সেটিংসে আরও উপযুক্ত হবে (পি >> এন)। কার্নেল পিসিএ মূলত এনএক্সএন কার্নেল ম্যাট্রিক্স (ডাটা পয়েন্টগুলির মধ্যে মিলের ম্যাট্রিক্স) এর সাথে কাজ করে, বরং বড় পি এর জন্য যে সমস্যা মোকাবেলা করা কঠিন, কার্নেল পিসিএ সম্পর্কে আরও একটি ভাল বিষয় হ'ল এটি লিনিয়ার অনুমানগুলি শিখতে পারে পাশাপাশি যদি আপনি এটি একটি উপযুক্ত কার্নেল ব্যবহার করেন। দেখুন কার্নেল পিসিএ এই কাগজ


2

আমি মনে করি মনে হচ্ছে যে এক্সএক্স ^ টির পরিবর্তে এক্স ^ টিএক্সের ইগেন-পচন গণনা করে পিসি পাওয়ার জন্য রূপান্তর করা সম্ভব হবে PC তবে আমি বিবরণগুলি হাতছাড়া করতে পারি না, তবে এটি জলিফের (দুর্দান্ত) বইটিতে রয়েছে এবং আমি যখন কাজের পাশে থাকব তখন তা সন্ধান করব। আমি লিনিয়ার বীজগণিতের রুটিনগুলিকে অন্য কোনও অ্যালগোরিদম ব্যবহার না করে C যেমন, সংখ্যাযুক্ত পদ্ধতিগুলি থেকে প্রতিলিপি করতে চাই।


5
শুভ দুঃখ ... কোভেরিয়েন্স ম্যাট্রিক্স তৈরি করা কখনও এসভিডির পক্ষে সেরা উপায় নয়। কেন স্পষ্টরূপে কোভারিয়েন্স ম্যাট্রিক্স গঠন করা গণিতের জন্য একটি ভাল ধারণা নয় সেটির একটি উদাহরণ আমি দেখিয়েছি SE SE: math.stackexchange.com/questions/3869/3871#3871
জেএম

1

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

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


0

উইকিপিডিয়া অ্যালগরিদম এটিকে উদ্ধৃত করে এবং এটি একবারে একটি মূল উপাদান খুঁজে পাওয়ার ক্ষেত্রে এর সমতুল্য।
dsimcha

ঠিক আছে, আমি এখন লিঙ্কটি দেখতে পাচ্ছি। এটি মোটামুটি সহজ পদ্ধতির, এবং উইকিপিডিয়া যেমন উল্লেখ করেছে, এই প্রাথমিক ধারণাটির উপরেও অগ্রগতি রয়েছে। প্রতিচ্ছবি যদিও, আপনি কিছু ধরণের বাণিজ্য-অফ (এই ক্ষেত্রে রূপান্তর) সাথে ডিল করতে হবে। আপনি যদি এখানে সঠিক প্রশ্ন জিজ্ঞাসা করেন তবে আমি অবাক হই। ডি এর জন্য লিনালাগ্র লাইব্রেরিতে আসলেই কোনও ভাল বাঁধা আছে?
আর্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.