গণনা এবং ডেটা-টোটাল না রেখে চলন্ত গড় গণনা কিভাবে করবেন?


118

আমি এখনও অবধি প্রাপ্ত গণনা এবং মোট ডেটা সংরক্ষণ না করে চলমান संचयी গড় গণনা করার উপায় খুঁজতে চেষ্টা করছি।

আমি দুটি অ্যালগরিদম নিয়ে এসেছি তবে উভয়কেই গণনা সংরক্ষণ করতে হবে:

  • নতুন গড় = ((পুরাতন গণনা * পুরানো ডেটা) + পরবর্তী ডেটা) / পরবর্তী গণনা
  • নতুন গড় = পুরানো গড় + (পরবর্তী ডেটা - পুরানো গড়) / পরবর্তী গণনা

এই পদ্ধতিগুলির সাথে সমস্যাটি হ'ল ফলশ্রুতিতে গড়ের যথাযথতা হারাতে ফল গণনা আরও বড় হয়।

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

এটি কি সম্ভব, নাকি আমি কেবল অসম্ভবকে অনুসন্ধান করছি?


1
NB যে সংখ্যাগতভাবে, বর্তমান মোট এবং বর্তমান গণনা সংরক্ষণ করা সবচেয়ে স্থিতিশীল উপায়। অন্যথায়, উচ্চ গণনাগুলির জন্য পরবর্তী / (পরবর্তী গণনা) পাতাল থেকে প্রবাহিত হবে। সুতরাং আপনি যদি নির্ভুলতা হারাতে সত্যিই উদ্বিগ্ন হন তবে মোট পরিমাণ রাখুন!
অ্যালেক্সআর

1
দেখুন উইকিপিডিয়া en.wikipedia.org/wiki/Moving_average
xmedeko

উত্তর:


91

আপনি সহজভাবে করতে পারেন:

double approxRollingAverage (double avg, double new_sample) {

    avg -= avg / N;
    avg += new_sample / N;

    return avg;
}

কোথায় Nনমুনা যেখানে আপনি গড় উপর করতে চান তার সংখ্যা। মনে রাখবেন যে এই আনুমানিকটি সূচকীয় চলমান গড়ের সমান। দেখুন: সি ++ এ রোলিং / মুভিং এভারেজ গণনা করুন


3
এই লাইনের আগে আপনাকে কী 1 এ যোগ করতে হবে না? গড় + = নতুন_ নমুনা / এন;
দামিয়ান

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

9
এটি একটি চলমান গড় নয়। আপনি যা বর্ণনা করছেন তা হ'ল একটি মেরু ফিল্টার যা সিগন্যালে ঝাঁপ দেওয়ার জন্য ক্ষতিকারক প্রতিক্রিয়া তৈরি করে। একটি চলমান গড় দৈর্ঘ্য এন সহ একটি রৈখিক প্রতিক্রিয়া তৈরি করে
রুহিগ ব্রানার

3
সাবধান থাকুন যে এটি গড়ের সাধারণ সংজ্ঞা থেকে বেশ দূরে from আপনি যদি এন = 5 সেট করেন এবং 5 টি 5নমুনা প্রবেশ করেন , গড় হবে 0.67।
ড্যান ড্যাসক্লেস্কু

2
@ ড্যানডাসকলেসকু আপনি যখন সঠিক হয়ে গেছেন যে এটি আসলে রোলিং গড় নয় তবে আপনার বর্ণিত মানটি প্রস্থের ক্রম দ্বারা বন্ধ রয়েছে। সঙ্গে avgসক্রিয়া 0, আপনি দিয়ে শেষ 3.365 পরে 5s, এবং 4.46পরে 10: cpp.sh/2ryql দীর্ঘ গড় জন্য, এই অবশ্যই একটি দরকারী পড়তা হয়।
সিনকোডেনদা

80
New average = old average * (n-1)/n + new value /n

এটি গণনাটি কেবলমাত্র একটি মান দ্বারা পরিবর্তিত হয়েছে বলে ধরে নেওয়া হচ্ছে। যদি এম এর মানগুলির দ্বারা তখন পরিবর্তন হয়:

new average = old average * (n-len(M))/n + (sum of values in M)/n).

এটি গাণিতিক সূত্র (আমি সবচেয়ে দক্ষ একটিকে বিশ্বাস করি), বিশ্বাস করুন যে আপনি নিজের দ্বারা আরও কোড করতে পারেন


নতুন মূল্য যোগফল কি? এটি কি আপনার মূল সূত্রে "নতুন মান" থেকে কোনওভাবে আলাদা?
মিখাইল

@ মিখাইল দ্বিতীয় উদাহরণে mনতুন মানকে নতুন গড় হিসাবে চিহ্নিত করা হচ্ছে। আমি বিশ্বাস করি যে sum of new valueএখানে mনতুন গড় গড় গণনা করতে ব্যবহৃত নতুন মানগুলির যোগফল বোঝানো হচ্ছে।
প্যাট্রিক গোলে

9
প্রথমটির জন্য সামান্যতর দক্ষ: new_average = (old_average * (n-1) + new_value) / n- ভাগগুলির মধ্যে একটি সরান।
পিক্সেলস্টিক্স

6,0,0,9 দিয়ে 3 টির গড় গড়ে কীভাবে চলবেন?
রওশন মেহতা

1
আমি যখন এই সমীকরণটি প্রয়োগ করি তখন মান বা চলমান গড় সবসময় ধীরে ধীরে বৃদ্ধি পায় increases এটি কখনও নেমে যায় না - কেবল উপরে।
anon58192932

30

নমুনা ভেরিয়েন্স গণনা চালানোর বিষয়ে একটি ব্লগ থেকে , যেখানে ভ্যাল্ডফোর্ডের পদ্ধতি ব্যবহার করে গড়টিও গণনা করা হয় :

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

খুব খারাপ আমরা এসভিজি চিত্রগুলি আপলোড করতে পারি না।


3
এটি মুইস বাস্তবায়নের অনুরূপ, বিভাজনটি একটি সাধারণ কারণ হিসাবে ব্যবহৃত হয়। সুতরাং শুধুমাত্র একটি বিভাগ।
ফ্লিপ করুন

এটি প্রকৃতপক্ষে @ আবদুল্লাহ-আল-এজেল (মূলতঃ পরিবহন গণিত) এর নিকটতম যে মুইস এনক্রিমেন্ট এন এর জন্য অ্যাকাউন্ট করে না; কপি-পেস্ট সূত্র রেফারেন্স: [এন এ গড়] = [গড় এন-1] (এক্স - [গড় এন-1]) / N
drzaus

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

21

এখানে কিভাবে এখনো অন্য উত্তর নৈবেদ্য ভাষ্য এর Muis , আব্দুল্লাহ আল Ageel এবং ফ্লিপ 'র উত্তর হয় সব গাণিতিকভাবে একই জিনিস ভিন্নভাবে লিখিত ছাড়া।

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

বরং একটি বড় পার্থক্য আছে

এটা এর Muis এর N, ফ্লিপ 'র k, এবং আব্দুল্লাহ আল Ageel এর nআব্দুল্লাহ আল Ageel বেশ কি ব্যাখ্যা না nকরা উচিত, কিন্তু Nএবং kযে পার্থক্য Nহল " নমুনা যেখানে তোমাদের উপর গড়ে পৌঁছাতে চান তার সংখ্যা " যখন kনমুনা মান গণনা করা হয়। (যদিও N নমুনার নাম্বারে কল করা সঠিক কিনা তা নিয়ে আমার সন্দেহ রয়েছে ))

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

ক্ষতিকারক ওজনে চলমান গড়

প্রাথমিকভাবে:

average = 0
counter = 0

প্রতিটি মান জন্য:

counter += 1
average = average + (value - average) / min(counter, FACTOR)

পার্থক্য min(counter, FACTOR)অংশ। এটি বলার মতোইmin(Flip's k, Muis's N)

FACTORএকটি ধ্রুবক যা সর্বশেষতম প্রবণতায় গড় কত দ্রুত "ক্যাচ আপ" প্রভাবিত করে। দ্রুত সংখ্যাটি ছোট করুন। ( 1এটি এখন আর গড় হয় না এবং কেবল সর্বশেষতম মান হয়ে যায়))

এই উত্তরের জন্য চলমান কাউন্টার দরকার counter। যদি সমস্যাযুক্ত হয় তবে এটিকে min(counter, FACTOR)কেবলমাত্র মুইসের উত্তরে FACTORরূপান্তরিত করে প্রতিস্থাপন করা যেতে পারে । এটি করার ক্ষেত্রে সমস্যাটি হ'ল চলন্ত গড় যা কিছুতে প্রাথমিকভাবে করা হয় তার দ্বারা প্রভাবিত হয় । যদি এটি সূচনা করা হয়average0 , তবে সেই শূন্যটি গড় ছাড়তে দীর্ঘ সময় নিতে পারে।

এটি দেখতে শেষ হয়

সূচকীয় চলমান গড়


3
ভাল করে বুঝিয়েছি। আমি কেবল আপনার গ্রাফের একটি সাধারণ গড় মিস করছি, কারণ ওপি যা চেয়েছিল তাই।
xmedeko

হতে পারে আমি কিছু মিস করছি, তবে আপনি কি, সুযোগটি পেয়েছেন max(counter, FACTOR)? min(counter, FACTOR)সবসময় ফ্যাক্টর ফিরে আসবে, তাইনা?
ওয়েবওয়ান্ডার

1
আমি বিশ্বাস করি যে এর বিন্দুটি min(counter, FACTOR)হ'ল ওয়ার্ম আপ পিরিয়ডের জন্য অ্যাকাউন্ট করা। এটি ব্যতীত, যদি আপনার ফ্যাক্টর (বা এন, বা পছন্দসই নমুনার গণনা) 1000 হয় তবে সঠিক ফলাফল পাওয়ার আগে আপনার কমপক্ষে 1000 টি নমুনা লাগবে, কারণ এর আগে সমস্ত আপডেটগুলি ধরে নিবে আপনার 1000 নমুনা থাকবে, যখন আপনি কেবলমাত্র 20.
rrter

ফ্যাক্টরটিতে পৌঁছানোর পরে গণনা বন্ধ করা ভাল হবে, সম্ভবত সেভাবে এটি আরও দ্রুত হবে।
inf3rno

8

ফ্লিপের উত্তর মুইসের চেয়ে কমপিট্যালি আরও সামঞ্জস্যপূর্ণ।

দ্বিগুণ সংখ্যার ফর্ম্যাট ব্যবহার করে আপনি মুইস পদ্ধতির রাউন্ডঅফ সমস্যাটি দেখতে পাবেন:

মুইস পদ্ধতির

আপনি বিভাজন এবং বিয়োগ করার সময়, এটি পরিবর্তন করে পূর্ববর্তী সঞ্চিত মানটিতে একটি গোলফুল উপস্থিত হয়।

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

ফ্লিপ পদ্ধতির

এই পরিবর্তনগুলি উল্লেখযোগ্য যখন আপনি বড় মূল্যবোধের গড় গড়ে শূন্যের দিকে ঝুঁকেন।

আমি আপনাকে একটি স্প্রেডশিট প্রোগ্রাম ব্যবহার করে ফলাফলগুলি দেখাব:

প্রথমত, প্রাপ্ত ফলাফল: ফলাফল

A এবং B কলামগুলি যথাক্রমে n এবং X_n মান।

সি কলামটি হ'ল ফ্লিপ পদ্ধতির, এবং ডি হ'ল মুইস পদ্ধতির, ফলাফলটি মাঝখানে সঞ্চিত। ই কলামটি গণনায় ব্যবহৃত মাঝারি মানের সাথে সামঞ্জস্য করে।

সম মানগুলির গড় বোঝায় এমন একটি গ্রাফ পরবর্তীটি:

চিত্রলেখ

আপনি দেখতে পাচ্ছেন যে উভয় পদ্ধতির মধ্যে বড় পার্থক্য রয়েছে।


2
সত্যই কোনও উত্তর নয়, তবে দরকারী তথ্য। এটি এমনকি ভাল হবে যদি আপনি আপনার গ্রাফ থেকে 3 য় লাইন যোগ করেছেন, সত্য গড় বেশী তাদের জন্য এন গত মান, তাই আমরা দেখতে পারে যা দুই পন্থা নিকটতম আসে।
jpaugh

2
@ জেপফো: বি কলামটি -1.00E + 15 এবং 1.00E + 15 এর মধ্যে পরিবর্তিত হচ্ছে, সুতরাং যখন এন সমান হয় তখন প্রকৃত গড়টি 0 হওয়া উচিত গ্রাফের শিরোনাম "এমনকি আংশিক মানে" " এর অর্থ হল যে আপনি যে তৃতীয় লাইনের বিষয়ে জিজ্ঞাসা করছেন তা কেবল f (x) = 0। গ্রাফটি দেখায় যে উভয় পদ্ধতিরই ত্রুটিগুলি প্রবর্তন করে যা উপরের দিকে চলে।
দেশউইন

এটি সঠিক, গ্রাফ দুটি পদ্ধতির সাহায্যে গণনার সাথে জড়িত বড় সংখ্যা ব্যবহার করে ঠিক ত্রুটিটি প্রচার করে shows
হোসে ম্যানুয়েল রামোস

আপনার গ্রাফের কিংবদন্তির ভুল রঙ রয়েছে: মুইস কমলা, ফ্লিপের নীল।
xmedeko

6

তুলনা করার জন্য জাভাস্ক্রিপ্ট ব্যবহার করে একটি উদাহরণ:

https://jsfiddle.net/drzaus/Lxsa4rpz/

function calcNormalAvg(list) {
    // sum(list) / len(list)
    return list.reduce(function(a, b) { return a + b; }) / list.length;
}
function calcRunningAvg(previousAverage, currentNumber, index) {
    // [ avg' * (n-1) + x ] / n
    return ( previousAverage * (index - 1) + currentNumber ) / index;
}


1

জাভা 8-তে:

LongSummaryStatistics movingAverage = new LongSummaryStatistics();
movingAverage.accept(new data);
...
average = movingAverage.getAverage();

তোমারও আছে IntSummaryStatistics, DoubleSummaryStatistics...


2
ওপা জাভাতে কীভাবে এটি গণনা করা যায় তা নির্দেশকের জন্য নয়, একটি অ্যালগরিদমের জন্য জিজ্ঞাসা করছে।
#q_plo

0

উপরের উত্তরের উপর ভিত্তি করে একটি ঝরঝরে পাইথন সমাধান:

class RunningAverage():
    def __init__(self):
        self.average = 0
        self.n = 0
        
    def __call__(self, new_value):
        self.n += 1
        self.average = (self.average * (self.n-1) + new_value) / self.n 
        
    def __float__(self):
        return self.average
    
    def __repr__(self):
        return "average: " + str(self.average)

ব্যবহার:

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