برای محاسبهٔ واریانسِ دادهای که یکییکی میرسد،لازم نیست تابعِ محاسبه همهٔ تاریخچه را نگه دارد. روش Welford با تعداد n،میانگین و M2 جلو میرود. این تمرین هر وضعیتِ میانی را با یک oracle کسریِ مستقل مقایسه میکند؛ عدد نهاییِ درست بهتنهایی شاهدِ کافی برای درستبودنِ مسیر نیست.
دادهٔ بزرگ،پراکندگیِ کوچک
هشت ورودیِ اصیل از۱۰بهتوان۱۲بهعلاوهٔ۱ تا۱۰بهتوان۱۲بهعلاوهٔ۸ هستند. خودِ عددها بزرگاند،اما اختلافشان فقط چند واحد است. میانگینِ نهایی۱۰۰۰۰۰۰۰۰۰۰۰۴٫۵ و مجموعِ مربعِ فاصلهها از آن۴۲ میشود. این اعداد اطلاعاتِ مصرف،قیمت یا مشتری واقعی نیستند.
کد دو اجرای جدا دارد: یکی با Fraction برای حسابِ دقیقِ همین ورودیها و دیگری با floatِ Python۳٫۱۲٫۱۴. جدول خروجی،n،میانگین،M2 و اختلافِ دقیقِ M2ِ ممیزشناور با مرجع را برای هر پیشوند ثبت میکند. نگهداشتن این جدول برای آموزش است؛ به تابعِ online،حافظهٔ تمام جدول را نسبت نمیدهیم.
بهروزرسانی از وضعیت قبلی
پس از رسیدنِ x،ابتدا تعداد را یکی زیاد میکنیم. delta اختلافِ x با میانگینِ قبلی است؛ میانگینِ تازه با افزودن delta/n ساخته میشود. سپس M2 با delta ضربدر اختلافِ x و میانگینِ تازه افزایش مییابد. ترتیبِ «میانگینِ قبلی» و«میانگینِ تازه» مهم است؛ جایگزینکردن بیدقت آنها رابطه را عوض میکند.
n += 1 delta = x - mean mean += delta / n M2 += delta * (x - mean)
M2 خودِ واریانس نیست. برای واریانس جمعیتی،آن را بر n تقسیم میکنیم؛ برای واریانس نمونهای،بر n−1،به شرط n≥2. در این مثال۴۲÷۸=۲۱/۴ و۴۲÷۷=۶ است. انتخاب مخرج،پرسش آماری را تغییر میدهد و یک جزئیاتِ قالببندی نیست.
هر پیشوند را جدا کنترل کنیم
بعد از دو ورودی،M2 برابر۱/۲ و پس از چهار ورودی۵ است. بعد از هشت ورودی۴۲ میشود. oracle مستقل برای هر پیشوند،ابتدا میانگین را از جمعِ دقیق میگیرد و سپس تمام مربعِ فاصلهها را دوباره جمع میکند. هر هشت وضعیت با این تعریفِ دوگذر برابر شدهاند.
تابعِ online فقط سه مقدار کاری را بهروز میکند و از iterator یکبار عبور میکند. تاریخچهٔ جدا و oracle در demo برای آزمایش حضور دارند؛ هزینهٔ آنها را پنهان نمیکنیم. ادعای جریان بینهایت،ذخیرهسازی دائمی یا بازیابی بعد از قطع فرایند در این کد نداریم.
چرا فرمولِ تفاضلِ دو عدد بزرگ مشکل دارد؟
در اجرای همین دادهها،حسابِ floatِ میانگینِ x² منهای مربعِ میانگین،صفر میدهد؛ مرجعِ جمعیتی۲۱/۴ است. کمشدن دو مقدار بزرگِ نزدیک میتواند اختلاف کوچک را از دست بدهد. این شاهدِ مشخص را به حکمِ «هر اجرای دیگر حتماً همین صفر میدهد» تبدیل نکنید.
خودِ Welfordِ ممیزشناور هم حساب دقیقِ عمومی نیست. شش ترتیبِ سه ورودیِ اعشاریِ نزدیک۱۰بهتوان۱۲ جدا اجرا شدهاند و خطا نسبت به کسر دقیقِ همان floatهای بازنماییشده در JSON هست. از موفقیتِ هشت عدد صحیح،برابری بیتی برای همهٔ جایگشتها یا همهٔ دادهها نتیجه نمیگیریم.
خالی،تکعضو و شروعِ دوباره
برای جریان خالی هیچ وضعیتِ مشاهدهشده نداریم. تکعضو،واریانس جمعیتی صفر ولی واریانس نمونهای تعریفنشده دارد؛ فایل آن را null گزارش میکند. NaN،بینهایت،بولین و مقدارِ بیرونِ کران محلی۱۰بهتوان۱۳ رد میشوند. این کران،قرارداد تمرین است و تعریفِ عمومیِ Welford نیست.
اگر نیمهٔ دوم داده را با state صفر شروع کنیم،n برابر۴ وM2 برابر۵ میشود،نه وضعیتِ کاملِ هشت ورودی. reset و ادامهدادن یکی نیستند. استانداردسازی ویژگی دربارهٔ انتخاب دادهٔ برازش و نشت است؛ جمع ممیزشناور هم مسئلهٔ جمع را جدا میکند. ادامه در مبانی هوش مصنوعی؛ این تمرین قابلیتِ آمارِ جریانی یا آموزش مدل در محصول اپرا را وعده نمیدهد.
فایل تمرین و منبع
کد مستقلِ تمرین و کنترلها؛ Python · ورودیها و تمام خروجی واقعیِ همین تمرین؛ JSON
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.