একটি বিশাল রিড-ডেটা সেট সেটটির মধ্যমটি অনুমান করার জন্য একটি ভাল অ্যালগরিদম কী?


47

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

যথাযথতা যতক্ষণ জানা যায় ততক্ষণ আনুমানিকতা ঠিক আছে।

কোন পয়েন্টার?


4
সম্ভবত, স্ট্যাকওভারফ্লোতে জিজ্ঞাসা করা আরও ভাল উত্তর পেতে পারে।

2
@ শ্রীকান্ত:> এটি পরিসংখ্যানগুলিতে গবেষণার একটি বেশ সক্রিয় ক্ষেত্র :) স্টোরেজের ক্ষেত্রে নীচের তাত্ত্বিক সীমাটির নিকটতম সমাধানটিও কিছু চমত্কার সম্ভাব্য সম্ভাবনা কাঠামোকে জড়িত। আমি যখন কয়েক মাস আগে প্রথমবার এটির দিকে তাকিয়ে ছিলাম তখন অবাক হয়েছি; চোখের দেখা পাওয়ার চেয়ে এখানে আরও পরিসংখ্যান রয়েছে।
ব্যবহারকারী 60

উত্তর:


6

আপনি কি আরও ছোট ডেটা সেটগুলিতে সেট করা ডেটাগুলিকে গ্রুপ করে ফেলতে পারেন (100 বা 1000 বা 10,000 ডাটা পয়েন্ট বলুন) আপনি যদি তখন গ্রুপগুলির প্রত্যেকটির মধ্যম গণনা করেন। আপনি যদি যথেষ্ট ডেটা সেট দিয়ে এটি করেন তবে আপনি প্রতিটি ছোট সেটগুলির ফলাফলের গড়ের মতো কোনও কিছুর পরিকল্পনা করতে পারেন এবং এই ছোট্ট ডেটা সেট চালিয়ে একটি 'গড়' সমাধানে রূপান্তর করতে পারেন oul


এটি আকর্ষণীয় এবং যেখানে কিছু পরিসংখ্যানের পরামর্শ আসতে পারে! ধরুন মোট আমি পেয়েছি (বলুন) 500,000 আইআইডি পয়েন্ট পেয়েছি এবং আমি এর মধ্যে 1000 টি (বলুন) এর গ্রুপগুলি দেখি এবং প্রতিটি দলের মধ্যম গণনা করি। এখন আমি 500 মিডিয়ান পেয়েছি। এমন কোন তত্ত্ব আছে যা আমাকে এই ৫০০ টি মধ্যমাধ্যমের উপর ভিত্তি করে সামগ্রিক মধ্যস্থতার জন্য একটি আত্মবিশ্বাসের ব্যবধান গণনা করার অনুমতি দিতে পারে?
পিটারআর

4
সুতরাং, দীর্ঘ হারিয়ে যাওয়া সহকর্মীর মতে, সেরা এপ্রোপোচকে চিরঞ্জিব বুরাগোহেইন এবং সুভাষ সুরী বলে মনে হচ্ছে। স্ট্রিমগুলিতে কোয়ান্টাইলস। cs.ucsb.edu/~suri/psdir/ency.pdf আমিও আয়ানের পদ্ধতির পছন্দ করি, কারণ ছোট ডেটা সেটগুলির এই মিডিয়ানরা একটি সাধারণ বিতরণে রূপান্তরিত করে, এবং তাই আমি মধ্যস্থদের জন্য অন্তর অন্তর গঠন করতে পারি।
পিটারআর

9

বিনিং পদ্ধতির মতো কিছু সম্পর্কে কীভাবে? ধরে নিন (চিত্রণমূলক উদ্দেশ্যে) যে আপনি জানেন যে মানগুলি 1 থেকে 1 মিলিয়নের মধ্যে থাকে। আকারের এন বিনগুলি সেট আপ করুন, সুতরাং যদি এস = 10000 হয় তবে মানগুলির সাথে মিল রেখে আপনার 100 টি বিন থাকবে [1: 10000, 10001: 20000, ..., 990001: 1000000]

তারপরে, মানগুলির মধ্য দিয়ে পদক্ষেপ দিন। প্রতিটি মান সংরক্ষণ করার পরিবর্তে, উপযুক্ত বিনে কাউন্টারটি বাড়িয়ে দিন। প্রতিটি বিনের মিডপয়েন্টটি অনুমান হিসাবে ব্যবহার করে, আপনি মাঝারিটির একটি যুক্তিসঙ্গত সংস্থান করতে পারেন। আপনি বিনের আকার পরিবর্তন করে এটির হিসাবে সমাধানের হিসাবে সূক্ষ্ম বা মোটা করতে স্কেল করতে পারেন। আপনার কত স্মৃতি রয়েছে কেবল তার দ্বারা আপনি সীমাবদ্ধ।

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

সম্পাদনা:

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


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

যেহেতু আপনি কেবল মিডিয়ায় আগ্রহী তাই কেন আপনি আপনার পরিবর্তনশীলের উচ্চতর মানগুলিতে বিনগুলি আরও বিস্তৃত করতে পারেন না?
রাসেলপিয়ের্স

drknexus - কারণ বৃহত্তম বিনটি কী হওয়া উচিত তা আমরা জানি না।
পিটারআর

পরিসীমাটি কী হবে সে সম্পর্কে আপনার কোনও अंतर्ज्ञान আছে ? যদি আপনি মোটামুটি নিশ্চিত হন যে উত্তরগুলির অর্ধেকেরও বেশি উত্তর এন এর নীচে থাকবে, তবে আপনি নিজের শেষ বিনটি যতটা চাইছেন তেমন বড় করতে পারেন। হতে পারে আপনার শেষ বিনটি সমস্ত সংখ্যা 1 ট্রিলিয়ন এর চেয়ে বেশি - এটি কি যথেষ্ট বেশি হবে? আধুনিক সিস্টেমে মেমরির পরিমাণের সাথে আপনি প্রচুর বিনা সঞ্চয় করতে পারেন এবং মোটামুটি উচ্চ রেজোলিউশন অর্জন করতে পারেন। ডেটা স্ট্রাকচারের ক্ষেত্রে, আমরা এখানে অভিনব এবং স্মৃতি নিবিড় কিছু বলছি না।
ক্রিসমিলার

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

9

আমি আপনাকে অনুরূপ প্রশ্নের আমার উত্তরটিতে পুনরায় নির্দেশনা দিচ্ছি । সংক্ষেপে, এটি একবার পড়ে 'ওড়ায়' অ্যালগরিদমের সাথে readO(n)


8

Rivest-Tarjan-নির্বাচন অ্যালগরিদম (কখনও কখনও নামেও মধ্যমা অফ মধ্যমা অ্যালগরিদম) যদি আপনি কোন বাছাই ছাড়া রৈখিক টাইমে মধ্যমা উপাদান গনা দেওয়া হবে। বড় ডেটা সেটগুলির জন্য এটি লগ-লিনিয়ার বাছাইয়ের তুলনায় বেশ কিছুটা দ্রুত হতে পারে। তবে এটি আপনার মেমরি স্টোরেজ সমস্যার সমাধান করবে না।


7

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


(+1) বন্ধ করে দেওয়া এবং এই লিঙ্কটি সরবরাহ করার জন্য ধন্যবাদ, শন!
whuber

2

আমার কখনই এটি করতে হয়নি, সুতরাং এটি কেবল একটি পরামর্শ।

আমি দুটি (অন্যান্য) সম্ভাবনা দেখছি।

অর্ধেক ডেটা

  1. অর্ধেক ডেটা লোড করুন এবং সাজান
  2. পরবর্তী মানগুলিতে পড়ুন এবং আপনার সাজানো তালিকার তুলনায় তুলনা করুন।
    1. নতুন মানটি বড় হলে এটিকে বাতিল করুন।
    2. অন্যথায় বাছাই করা তালিকায় মান রাখুন এবং সেই তালিকা থেকে বৃহত্তম মানটি সরিয়ে দিন removing

নমুনা বিতরণ

অন্য বিকল্পটি হ'ল নমুনা বিতরণ জড়িত একটি অনুমান ব্যবহার করা। যদি আপনার ডেটা স্বাভাবিক হয়, তবে মাঝারি n এর জন্য আদর্শ ত্রুটিটি হ'ল:

1.253 * এসডি / স্কয়ার্ট (এন)

আপনি যে খুশি হবেন এমন এন এর আকার নির্ধারণ করতে , আমি আর তে একটি দ্রুত মন্টে-কার্লো সিমুলেশন চালিয়েছি

n = 10000
outside.ci.uni = 0
outside.ci.nor = 0
N=1000
for(i in 1:N){
  #Theoretical median is 0
  uni = runif(n, -10, 10)
  nor  = rnorm(n, 0, 10)

  if(abs(median(uni)) > 1.96*1.253*sd(uni)/sqrt(n))
    outside.ci.uni = outside.ci.uni + 1

  if(abs(median(nor)) > 1.96*1.253*sd(nor)/sqrt(n))
    outside.ci.nor = outside.ci.nor + 1
}

outside.ci.uni/N
outside.ci.nor/N

এন = 10000 এর জন্য, ইউনিফর্ম মিডিয়ান অনুমানের 15% সিআই এর বাইরে ছিল।


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


1

স্ট্যাকওভারফ্লোতে জিজ্ঞাসিত প্রশ্নের উত্তর এখানে দেওয়া হয়েছে: https://stackoverflow.com

পুনরাবৃত্ত আপডেটের মিডিয়ান + = এটা * এসএনজি (নমুনা - মিডিয়ান) মনে হচ্ছে এটি যাওয়ার কোনও উপায় হতে পারে।


1
তবে কীভাবে এটা চয়ন করবেন, এবং এর পরে পরিসংখ্যান বলতে কী বোঝায়? অর্থাত্ এই ফলাফল থেকে মধ্যকের জন্য আস্থা অন্তর কীভাবে গঠন করবেন?
পিটারআর

@ পিটারআর, আরে, আপনি কী চূড়ান্ত সমাধানটি ব্যবহার করেছেন?
আকাশ গোয়েল

1

Remedian অ্যালগরিদম (পিডিএফ) কম সঞ্চয় প্রয়োজনীয়তা এবং সু-সংজ্ঞায়িত সঠিকতা সঙ্গে একটি এক পাস মধ্যমা অনুমান দেয়।

বেস বি দিয়ে প্রতিকারকারী বি পর্যবেক্ষণের গ্রুপগুলির মিডিয়ানগুলির গণনা করে এবং তারপরে এই মিডিয়ানদের মধ্যকগণের দ্বারা এগিয়ে যায়, যতক্ষণ না কেবল একটি একক অনুমান থাকে। এই পদ্ধতিতে কেবল খ আকারের k অ্যারে প্রয়োজন (যেখানে এন = বি ^ কে) ...


1

যদি আপনি যে মানগুলি ব্যবহার করছেন তা যদি একটি নির্দিষ্ট পরিসরের মধ্যে থাকে, তবে 1 থেকে 100000 বলুন, আপনি একটি পূর্ণসংখ্যক বালতি (একটি বিএসডি লাইসেন্স প্রাপ্ত ইএ থেকে নেওয়া এই কোডটি) সহ একটি বিশাল সংখ্যক মানগুলিতে (বলুন, ট্রিলিয়ন এন্ট্রি) দক্ষতার সাথে মিডিয়েনটি গুণতে পারেন ( -utils / স্যাম-stats.cpp)

class ibucket {
public:
    int tot;
    vector<int> dat;
    ibucket(int max) {dat.resize(max+1);tot=0;}
    int size() const {return tot;};

    int operator[] (int n) const {
        assert(n < size());
        int i;
        for (i=0;i<dat.size();++i) {
            if (n < dat[i]) {
                return i;
            }
            n-=dat[i];
        }
    }

    void push(int v) {
        assert(v<dat.size());
        ++dat[v];
        ++tot;
    }
};


template <class vtype>
double quantile(const vtype &vec, double p) {
        int l = vec.size();
        if (!l) return 0;
        double t = ((double)l-1)*p;
        int it = (int) t;
        int v=vec[it];
        if (t > (double)it) {
                return (v + (t-it) * (vec[it+1] - v));
        } else {
                return v;
        }
}

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