সরল-থেকে-কোড হে (এন + কে * লগ (কে)) উপায়
সূচকগুলি প্রতিস্থাপন ছাড়াই এলোমেলো নমুনা নিন, সূচকগুলি বাছাই করুন এবং সেগুলি মূল থেকে নেওয়া।
indices = random.sample(range(len(myList)), K)
[myList[i] for i in sorted(indices)]
বা আরও সংক্ষিপ্তভাবে:
[x[1] for x in sorted(random.sample(enumerate(myList),K))]
অপ্টিমাইজড ও (এন) -সময়ের, হে (1) -অক্সিলিয়ারি-স্পেস ওয়ে
আপনি বৈকল্পিকভাবে একটি গণিতের কৌশল ব্যবহার করতে পারেন এবং পুনরাবৃত্তভাবে myList
বাম থেকে ডানে যেতে পারেন , পরিবর্তনশীল-পরিবর্তনের সম্ভাবনার সাথে সংখ্যাগুলি বাছাই করে (N-numbersPicked)/(total-numbersVisited)
। এই পদ্ধতির সুবিধা হ'ল এটি একটি O(N)
অ্যালগরিদম যেহেতু এটি বাছাইয়ের সাথে জড়িত নয়!
from __future__ import division
def orderedSampleWithoutReplacement(seq, k):
if not 0<=k<=len(seq):
raise ValueError('Required that 0 <= sample_size <= population_size')
numbersPicked = 0
for i,number in enumerate(seq):
prob = (k-numbersPicked)/(len(seq)-i)
if random.random() < prob:
yield number
numbersPicked += 1
ধারণা এবং পরীক্ষার প্রমাণ যে সম্ভাবনাগুলি সঠিক :
২ ঘন্টা ধরে 1 ট্রিলিয়ন সিউডোর্যান্ডম নমুনা সহ সিমুলেটেড:
>>> Counter(
tuple(orderedSampleWithoutReplacement([0,1,2,3], 2))
for _ in range(10**9)
)
Counter({
(0, 3): 166680161,
(1, 2): 166672608,
(0, 2): 166669915,
(2, 3): 166667390,
(1, 3): 166660630,
(0, 1): 166649296
})
সম্ভাব্যতাগুলি সম্ভাব্যতাগুলি থেকে 1.0001 এর কম ফ্যাক্টর দ্বারা প্রকৃত সম্ভাবনাগুলি থেকে আলাদা করা হয়। এই পরীক্ষাটি আবার চালানোর ফলে ভিন্ন অর্ডার হয়েছে যার অর্থ এটি কোনও অর্ডারের দিকে পক্ষপাতদুষ্ট নয়। এর জন্য কম নমুনা নিয়ে পরীক্ষা চালানো [0,1,2,3,4], k=3
এবং [0,1,2,3,4,5], k=4
এর একই রকম ফলাফল had
সম্পাদনা করুন: কেন লোকেরা ভুল মন্তব্যে ভোট দিচ্ছেন বা উজ্জীবিত হতে ভয় করছেন তা নিশ্চিত নয় ... না, এই পদ্ধতিতে কোনও ভুল নেই। =)
(মন্তব্যগুলিতে ব্যবহারকারী তেগনের কাছ থেকে একটি দরকারী নোট: এটি যদি অজগর 2 হয় তবে আপনি যদি অতিরিক্ত স্থান সম্পর্কে সত্যই যত্নশীল হন তবে আপনি যথারীতি এক্সরেঞ্জ ব্যবহার করতে চাইবেন))
সম্পাদনা : প্রুফ: আকারের k
জনসংখ্যার বাইরে একটি উপসেট বাছাইয়ের অভিন্ন বিতরণ (প্রতিস্থাপন ছাড়াই) বিবেচনা করে , আমরা একটি বামে একটি নির্বিচার বিন্দুতে একটি পার্টিশন বিবেচনা করতে পারি (0,1, ..., i-1) এবং 'ডান' (i, i + 1, ..., লেন (সিক)) প্রদত্ত যে আমরা বাম পরিচিত উপসেটটি থেকেছি, বাকিগুলি অবশ্যই ডান অজানা সাবসেটে একই ইউনিফর্ম বিতরণ থেকে আসতে হবে, যদিও প্যারামিটারগুলি এখন ভিন্ন। বিশেষত, সম্ভাবনা যেseq
len(seq)
i
numbersPicked
seq[i]
একটি নির্বাচিত উপাদান রয়েছে এমন হ'ল #remainingToChoose/#remainingToChooseFrom
, বা(k-numbersPicked)/(len(seq)-i)
, তাই আমরা তা অনুকরণ এবং ফলাফল পুনরাবৃত্তি। (এটি অবশ্যই অবসান হতে হবে যদি # রিমেনিংটুচুজ == # রিটার্নিং টোচুজফ্রোম থেকে থাকে তবে সমস্ত অবশিষ্ট সম্ভাবনা ১ হয়)) এটি গতিশীলভাবে উত্পন্ন হওয়ার সম্ভাবনা গাছের মতো। মূলত আপনি পূর্ব পছন্দগুলির উপর কন্ডিশনিং দ্বারা অভিন্ন সম্ভাব্যতা বন্টন অনুকরণ করতে পারেন (আপনি সম্ভাব্য গাছটি বাড়ার সাথে সাথে আপনি বর্তমান শাখার সম্ভাবনাটি বেছে নেবেন যেমন এটি পূর্বের পাতার মতো একই রকম, যেমন পূর্বের পছন্দগুলিতে শর্তযুক্ত; এটি কাজ করবে কারণ এই সম্ভাবনাটি সমানভাবে এন / কে)।
সম্পাদনা : টিমোথি শিল্ডস জলাধার স্যাম্পলিংয়ের উল্লেখ করেছে , যা len(seq)
অজানা (যেমন জেনারেটর এক্সপ্রেশন সহ) অজানা অবস্থায় এই পদ্ধতির সাধারণীকরণ । বিশেষত "অ্যালগরিদম আর" হিসাবে উল্লিখিত একটিটি যদি স্থান-স্থানে করা হয় তবে ও (এন) এবং ও (1) স্থান; এটি প্রথম এন উপাদান গ্রহণ এবং ধীরে ধীরে তাদের প্রতিস্থাপন জড়িত (একটি প্ররোচক প্রমাণ একটি ইঙ্গিতও দেওয়া হয়)। উইকিপিডিয়া পৃষ্ঠায় সন্ধানের জন্য দরকারী বিতরণযোগ্য রূপগুলি এবং জলাধার নমুনার বিবিধ রূপগুলিও রয়েছে।
সম্পাদনা করুন : এখানে আরও শব্দার্থিকভাবে সুস্পষ্ট পদ্ধতিতে কোড করার আরও একটি উপায়।
from __future__ import division
import random
def orderedSampleWithoutReplacement(seq, sampleSize):
totalElems = len(seq)
if not 0<=sampleSize<=totalElems:
raise ValueError('Required that 0 <= sample_size <= population_size')
picksRemaining = sampleSize
for elemsSeen,element in enumerate(seq):
elemsRemaining = totalElems - elemsSeen
prob = picksRemaining/elemsRemaining
if random.random() < prob:
yield element
picksRemaining -= 1
from collections import Counter
Counter(
tuple(orderedSampleWithoutReplacement([0,1,2,3], 2))
for _ in range(10**5)
)
random.sample
এবং তারপর বাছাই করতে চান না ?