من سعی می کنم راهی برای محاسبه میانگین تجمعی در حال حرکت بدون ذخیره تعداد و کل داده های دریافت شده تاکنون پیدا کنم.
من با دو الگوریتم روبرو شدم اما هر دو نیاز به ذخیره شمارش دارند:
- میانگین جدید = ((تعداد قدیمی * داده های قدیمی) + داده های بعدی) / تعداد بعدی
- میانگین جدید = میانگین قدیمی + (داده های بعدی - میانگین قدیمی) / تعداد بعدی
مشکل این روش ها این است که تعداد تعداد بزرگتر و بزرگتر می شود و در نتیجه از دست دادن دقت در میانگین حاصل می شود.
روش اول از شمارش قدیمی و تعداد بعدی که بدیهی است 1 از هم فاصله دارند استفاده می کند. این باعث شد من فکر کنم که شاید راهی برای حذف شمارش وجود داشته باشد اما متأسفانه من هنوز آن را پیدا نکرده ام. هرچند که من کمی بیشتر به دست آورد ، و در نتیجه روش دوم اما هنوز تعداد وجود دارد.
آیا ممکن است ، یا من فقط به دنبال غیرممکن هستم؟
NB که از نظر عددی ، ذخیره تعداد کل و فعلی فعلی ، پایدارترین راه است. در غیر این صورت ، برای تعداد بالاتر بعدی/(تعداد بعدی) شروع به جریان می کند. بنابراین اگر واقعاً نگران از دست دادن دقت هستید ، جمع را حفظ کنید!
8 پاسخ 8
شما به سادگی می توانید انجام دهید:
جایی که n تعداد نمونه هایی است که می خواهید به طور متوسط از آن استفاده کنید. توجه داشته باشید که این تقریب معادل میانگین متحرک نمایی است. مشاهده کنید: میانگین نورد / حرکت را در C ++ محاسبه کنید
این کاملا درست نیست. آنچه Muis توصیف می کند ، یک استحکام متحرک با وزن قابل استفاده است ، که گاهی مناسب است اما دقیقاً همان چیزی نیست که OP درخواست کرده است. به عنوان نمونه ، رفتاری را که انتظار دارید وقتی بیشتر نقاط در محدوده 2 تا 4 قرار دارند ، در نظر بگیرید اما یک ارزش به بالا یک میلیون است. یک EWMA (در اینجا) برای مدتی اثری از آن میلیون را نگه می دارد. یک حلقوی محدود ، همانطور که توسط OP نشان داده شده است ، بلافاصله پس از N مرحله آن را از دست می دهد. این مزیت از ذخیره سازی ثابت را دارد.
این یک میانگین متحرک نیست. آنچه شما توصیف می کنید یک فیلتر یک قطب است که پاسخ های نمایی را به پرش در سیگنال ایجاد می کند. میانگین متحرک یک پاسخ خطی با طول N ایجاد می کند.
مراقب باشید که این کاملاً از تعریف مشترک متوسط فاصله دارد. اگر n = 5 را تنظیم کرده و 5 نمونه 5 را وارد کنید ، میانگین 0. 67 خواهد بود.
dandascalescu این فرض بر این است که AVG با 0. تنظیم می شود. اگر در عوض آن را به عنصر اول تنظیم کنید ، بسیار بهتر رفتار می کند. در مثال شما 5 ثانیه خواهد بود.
این فرض می کند که تعداد فقط با یک مقدار تغییر کرده است. در صورت تغییر توسط مقادیر M پس از آن:
این فرمول ریاضی است (من معتقدم کارآمدترین است) ، معتقدم که می توانید کد بیشتری را توسط خودتان انجام دهید
mikhail در مثال دوم ، مقادیر جدیدی وجود دارد که به میانگین جدید وارد می شوند. من معتقدم که مبلغ جدید در اینجا به معنای جمع مقادیر جدید M برای محاسبه میانگین جدید است.
کمی کارآمدتر برای اولین بار: new_average = (old_avery * (n-1) + new_value) / n-یکی از تقسیمات را حذف می کند.
وقتی این معادله را پیاده سازی می کنم ، مقدار یا میانگین دویدن همیشه به آرامی افزایش می یابد. هرگز پایین نمی رود - فقط بالا.
از یک وبلاگ در مورد محاسبات واریانس نمونه ، که در آن میانگین نیز با استفاده از روش ولفورد محاسبه می شود:
خیلی بد نیست که ما نمی توانیم تصاویر SVG را بارگذاری کنیم.
این شبیه به آنچه MUIS اجرا شده است ، به جز این که از این تقسیم از یک عامل مشترک استفاده می شود. بنابراین فقط یک بخش.
این در واقع به @عبدالله-آل-سنل (در اصل ریاضی رفتاری) نزدیکتر است ، زیرا MUIS برای افزایش n حساب نمی کند. مرجع فرمول کپی: [avg at n] = [avg at n-1] + (x-[avg at n-1]) / n
Flip & Drwaus: راه حل های Muis و Abdullah Ageel دقیقاً یکسان نیست؟این همان محاسبه است ، فقط متفاوت نوشته شده است. برای من این 3 پاسخ شناسه هستند ، این یکی بصری تر است (خیلی بد نیست که ما نمی توانیم از Mathjax استفاده کنیم).
در اینجا یک پاسخ دیگر وجود دارد که اظهار نظر در مورد چگونگی پاسخ MUIS ، عبدالله الگیل و فلیپ همه از نظر ریاضی یکسان است به جز اینکه به طور متفاوتی نوشته شده است.
مطمئناً ، ما تجزیه و تحلیل خوزه مانوئل راموس را توضیح می دهیم که توضیح می دهد که چگونه خطاهای گرد بر هر کمی متفاوت تأثیر می گذارد ، اما این وابسته به اجرای است و بر اساس نحوه استفاده هر پاسخ به کد تغییر می کند.
با این وجود یک تفاوت نسبتاً بزرگ وجود دارد
این در n ، k flip 's و عبدالله آل-سنل است. عبدالله الگیل کاملاً توضیح نمی دهد که n باید چه باشد ، اما n و k در این تفاوت وجود دارد که n "تعداد نمونه هایی که می خواهید به طور متوسط از آن استفاده کنید" است در حالی که k تعداد مقادیر نمونه برداری شده است.(گرچه من شک دارم که آیا تماس با تعداد نمونه ها دقیق است.)
و در اینجا ما به پاسخ زیر می رسیم. این در اصل همان میانگین متحرک وزن نمایی قدیمی به عنوان سایرین است ، بنابراین اگر به دنبال یک جایگزین هستید ، درست در اینجا متوقف شوید.
میانگین متحرک وزنی نمایی
تفاوت قسمت حداقل (پیشخوان ، عامل) است. این همان گفته Min (Flip's K ، N Muis's N) است.
فاکتور ثابت است که بر این که به سرعت "متوسط" به آخرین روند بر روی آخرین روند تأثیر می گذارد ، تأثیر می گذارد. تعداد کوچکتر سریعتر.(در 1 این به طور متوسط نیست و به آخرین مقدار تبدیل می شود.)
این پاسخ نیاز به پیشخوان در حال اجرا دارد. اگر مشکل ساز باشد ، می توان حداقل (پیشخوان ، فاکتور) را با عادلانه جایگزین کرد و آن را به جواب MUIS تبدیل کرد. مشکل انجام این کار این است که میانگین متحرک تحت تأثیر میانگین قرار می گیرد که در آن قرار می گیرد. اگر به 0 اولیه تبدیل شود ، این صفر می تواند مدت زمان زیادی طول بکشد تا راه خود را از میانگین کار کند.