আমি বৃহত্তর প্রতিসম স্কয়ার স্পার্স-ম্যাট্রিকেস (30000x30000 অবধি) এর ক্ষুদ্রতম ইগেনালুগুলির সাথে সামঞ্জস্যপূর্ণ কয়েকটি (5-500) ইগেনভেেক্টর গণনা করার চেষ্টা করছি যা 0.1% এর চেয়ে কম মান শূন্য নয়।
আমি বর্তমানে scipy.sparse.linalg.eigsh শিফট-ইনভার্ট মোডে (সিগমা = 0.0) ব্যবহার করছি, যা আমি এই বিষয়ের বিভিন্ন পোস্টের মাধ্যমে সন্ধান করেছি fe তবে বেশিরভাগ ক্ষেত্রে সমস্যাটি সমাধান করতে 1 ঘন্টা পর্যন্ত সময় লাগে। অন্যদিকে ফাংশনটি খুব দ্রুত, যদি আমি বৃহত্তম ইগেনুয়ালুগুলি (আমার সিস্টেমে সাব সেকেন্ড) জিজ্ঞাসা করি, যা ডকুমেন্টেশন থেকে প্রত্যাশিত ছিল।
যেহেতু আমি কাজ থেকে মতলবের সাথে বেশি পরিচিত, আমি অক্টাভাতে সমস্যাটি সমাধান করার চেষ্টা করেছি, যা আমাকে কয়েক সেকেন্ডে (সিগমা = 0) ব্যবহার করে একই ফলাফল দিয়েছে (কয়েক দশকে সাব 10)। যেহেতু আমি ইগেনভেেক্টর গণনা সহ অ্যালগরিদমের একটি প্যারামিটার সুইপ করতে চাই, সেই ধরণের সময় লাভ অজগরটিতেও দুর্দান্ত হবে।
আমি প্রথম প্যারামিটারগুলি পরিবর্তন করেছি (বিশেষত সহনশীলতা), কিন্তু টাইমসেকলে খুব বেশি পরিবর্তন হয়নি।
আমি উইন্ডোজে অ্যানাকোন্ডা ব্যবহার করছি, তবে স্কিপি দ্বারা ব্যবহৃত ল্যাপাক / বিএলএএস (যা একটি বিশাল ব্যথা ছিল) থেকে এমপিএল (ডিফল্ট অ্যানাকোন্ডা) থেকে ওপেনব্লাসে (ডকুমেন্টেশন অনুসারে অ্যাক্টেভ দ্বারা ব্যবহৃত) স্যুইচ করার চেষ্টা করেছি, তবে কোনও পরিবর্তন দেখতে পেল না কর্মক্ষমতা.
আমি বুঝতে পেরেছিলাম না, ব্যবহৃত আরপ্যাক (এবং কীভাবে) সম্পর্কে কিছু পরিবর্তন করার দরকার আছে কিনা?
আমি নিম্নলিখিত ড্রপবক্স-ফোল্ডারে কোডের জন্য একটি টেস্টকেস আপলোড করেছি: https://www.roidbox.com/sh/l6aa6izufzyzqr3/AABqij95hZOvRpnnjRaETQmka?dl=0
পাইথনে
import numpy as np
from scipy.sparse import csr_matrix, csc_matrix, linalg, load_npz
M = load_npz('M.npz')
evals, evecs = linalg.eigsh(M,k=6,sigma=0.0)
অষ্টাভে:
M=dlmread('M.txt');
M=spconvert(M);
[evecs,evals] = eigs(M,6,0);
কোন সাহায্য প্রশংসিত হয়!
মন্তব্য এবং পরামর্শের উপর ভিত্তি করে আমি কয়েকটি অতিরিক্ত বিকল্প চেষ্টা করেছিলাম:
অষ্টাভে:
eigs(M,6,0)
এবং eigs(M,6,'sm')
আমাকে একই ফলাফল দিন:
[1.8725e-05 1.0189e-05 7.5622e-06 7.5420e-07 -1.2239e-18 -2.5674e-16]
যখন eigs(M,6,'sa',struct('tol',2))
রূপান্তর
[1.0423 2.7604 6.1548 11.1310 18.0207 25.3933]
অনেক দ্রুত, তবে কেবল যদি সহনশীলতার মান 2 এর উপরে হয় তবে অন্যথায় এটি মোটেও রূপান্তরিত হয় না এবং মানগুলি দৃ strongly়ভাবে পৃথক হয়।
পাইথন:
eigsh(M,k=6,which='SA')
এবং eigsh(M,k=6,which='SM')
উভয়ই একত্রিত হয় না (কোনও কনভার্জেন্সে এআরপ্যাক ত্রুটি পৌঁছায় না)। শুধুমাত্র eigsh(M,k=6,sigma=0.0)
কিছু ইগেনভ্যালু দেয় (প্রায় এক ঘন্টার পরে), যা ক্ষুদ্রতমগুলির জন্য অষ্টভরের চেয়ে পৃথক (এমনকি আরও 1 টি অতিরিক্ত ছোট মান পাওয়া যায়):
[3.82923317e-17 3.32269886e-16 2.78039665e-10 7.54202273e-07 7.56251500e-06 1.01893934e-05]
যদি সহনশীলতা যথেষ্ট পরিমাণে থাকে তবে আমি এর থেকে ফলাফলও পাই eigsh(M,k=6,which='SA',tol='1')
যা অন্যান্য প্রাপ্ত মানগুলির কাছাকাছি আসে
[4.28732218e-14 7.54194948e-07 7.56220703e-06 1.01889544e-05, 1.87247350e-05 2.02652719e-05]
আবার বিভিন্ন সংখ্যক ছোট ইগন্যালুয়েস সহ গণনার সময় এখনও প্রায় 30 মিনিট। যদিও বিভিন্ন খুব ছোট মানগুলি বোধগম্য হয়, যেহেতু তারা 0 এর গুণককে উপস্থাপন করতে পারে, বিভিন্ন গুণটি আমাকে বিভ্রান্ত করে।
তদ্ব্যতীত, সায়পি এবং অষ্টাভেতে কিছু মৌলিক পার্থক্য রয়েছে বলে মনে হচ্ছে, যা আমি এখনও বুঝতে পারি না।