گرد کردن خطاها در طول انتقال

در باواریا، میانگین کلی نمره \(2{,}33\) نشان‌دهنده‌ی مناسب بودن برای دبیرستان \(2{,}34\) این‌طور نیست. در این مرز مشخص، ترتیب دو عملیات گرد کردن می‌تواند تعیین کند که کودک در کدام سمت قرار می‌گیرد. گونتر فلبینگر در یک پست وبلاگی در مورد پیامدهای بالقوه‌ی این اثر گرد کردن بحث می‌کند . من صرفاً از روی علاقه، خودم این اثرات را در تمام ترکیبات پایه‌های مجاز در مدل محاسبه کردم.


سوال اصلی من این است: چقدر پیش می‌آید که گرد کردن زودهنگام نمرات کل دروس منجر به نوع متفاوتی از محاسبه مدرسه نسبت به محاسبات با استفاده از میانگین‌های دروس گرد نشده شود؟ علاوه بر این، جالب است ببینیم اگر میانگین دروس جداگانه (همانطور که در آنجا پیشنهاد شده است) در ابتدا فقط تا یک رقم اعشار گرد شوند، چه تغییراتی ایجاد می‌شود.

طبق بخش ۶ آیین‌نامه مدارس ابتدایی باواریا، میانگین نمرات از نمرات دروس آلمانی، ریاضیات و مطالعات محلی و عمومی محاسبه می‌شود. آیین‌نامه اجرایی، محدودیت‌هایی را \(2{,}33\) و \(2{,}66\) تعیین می‌کند. در مدل محاسبه زیر، میانگین کلی هر درس تا دو رقم اعشار کوتاه شده و دوباره گرد نمی‌شود. بنابراین، برای مثال...

\[
\frac{2{,}33+2{,}34+2{,}34}{3}=2{,}3366\ldots \longrightarrow 2{,}33.
\]

این برای طبقه‌بندی بسیار مهم است: \(2{,}3366\ldots\) به \(2{,}34\) تبدیل نمی‌شود، بلکه \(2{,}33\) می‌شود و بنابراین هنوز برای مدرسه گرامر کافی است.

ورودی اولیه، گرد کردن اولیه را با مقادیر میانگین فرضی مختص هر موضوع \(1{,}6\) ، \(2{,}6\) و \(2{,}6\) نشان می‌دهد. از این مقادیر، ابتدا کل نمرات \(2\) ، \(3\) و \(3\) به دست می‌آیند. میانگین آنها عبارت است از

\[
\frac{2+3+3}{3}=2{,}6666\ldots \longrightarrow 2{,}66,
\]

که یعنی دانش‌آموز واجد شرایط پذیرش مستقیم در مدرسه گرامر نیست. با این حال، بدون گرد کردن نمرات به کل نمرات، نتیجه در مثال فرضی ... خواهد بود.

\[
\frac{1{,}6+2{,}6+2{,}6}{3}=2{,}2666\ldots \longrightarrow 2{,}26.
\]

در مثال دوم، گرد کردن در جهت مخالف عمل می‌کند: \(2{,}4\) ، \(3{,}4\) و \(2{,}4\) به مقادیر کل نت \(2\) ، \(3\) و \(2\) تبدیل می‌شوند که رسماً \(2{,}33\) می‌شود. با این حال، مقادیر گرد نشده منجر به \(2{,}73\) می‌شوند. مثال‌ها به وضوح این اثر را نشان می‌دهند. با این حال، آنها هنوز مشخص نمی‌کنند که این اتفاق چقدر رخ می‌دهد یا پیامدهای یک روش گرد کردن متفاوت چه خواهد بود.

بنابراین، برای محاسبه‌ام از یک فضای نتیجه‌ی واضح استفاده می‌کنم. میانگین هر آزمودنی می‌تواند یکی از مقادیر \(501\) درون آن باشد.

\[
1{,}00,\, 1{,}01,\, 1{,}02,\, \ldots, \, 5{,}99, \, 6{,}00
\]

فرض کنید. من به همه ترکیبات مرتب شده از زبان آلمانی، ریاضیات و مطالعات محلی و عمومی به طور یکسان وزن می‌دهم. بنابراین،

\[
501^3=125\,751\,501
\]

موارد. بنابراین، این مدل بدون ابهام، اما مصنوعی است: این مدل میانگین‌های آزمودنی‌ها با توزیع برابر، استقلال سه آزمودنی و گام‌های دقیقاً یک صدم را فرض می‌کند. این مدل توزیع واقعی کودکان دبستانی باواریا را منعکس نمی‌کند.

برای سه عامل به معنی \(d,m,h\) می‌نویسیم

\[
A(d,m,h)=\frac{\left\lfloor 100\cdot\frac{d+m+h}{3}\right\rfloor}{100}
\]

برای میانگین کلی که تا دو رقم اعشار کوتاه شده است. اکنون سه روش محاسبه را با هم مقایسه می‌کنیم.:

\[
\begin{aligned}
A_0 و = A(\نام عملگر{دور}(d)،\نام عملگر{دور}(m)،\نام عملگر{دور}(h))،\\
A_1 و = A(\نام عملگر {دور اول (d)،\نام عملگر {دور اول (m)،\نام عملگر {دور اول (h))،\\
A_\mathrm{ref} و = A(d,m,h).
\end{تراز شده}
\]

\(A_0\) مربوط به محاسبه با استفاده از نمرات کامل، \(A_1\) مربوط به پیشنهاد با یک رقم اعشار، و \(A_\mathrm{ref}\) مربوط به مرجع گرد نشده در مدل است. به عنوان مثال، این محاسبه را می‌توان مستقیماً در Rust پیاده‌سازی کرد.:

const SCHOOL_GYMNASIUM: i32 = 0;
const SCHOOL_REALSCHULE: i32 = 1;
const SCHOOL_MITTELSCHULE: i32 = 2;
const FLOAT_TOLERANCE: f64 = 1e-9;

#[derive(Clone, Copy, Default)]
struct Statistic {
    conflict_count: u64,
    total_count: u64,
}

fn determine_school(average: f64) -> i32 {
    if average <= 2.33 {
        return SCHOOL_GYMNASIUM;
    }
    if average <= 2.66 {
        return SCHOOL_REALSCHULE;
    }
    SCHOOL_MITTELSCHULE
}

fn calculate_average(note_deutsch: f64, note_mathe: f64, note_hsu: f64) -> f64 {
    let average = (note_deutsch + note_mathe + note_hsu) / 3.0;
    ((average + FLOAT_TOLERANCE) * 100.0).floor() / 100.0
}

fn round_to_whole_grade(grade: f64) -> f64 {
    grade.round()
}

fn round_to_one_decimal(grade: f64) -> f64 {
    (grade * 10.0).round() / 10.0
}

fn normalize_grade(grade: f64) -> f64 {
    (grade * 100.0).round() / 100.0
}

fn percentage(count: u64, total: u64) -> f64 {
    count as f64 / total as f64 * 100.0
}

fn main() {
    let mut combination_count = 0;
    let mut official_reference_conflicts = 0;
    let mut official_proposal_conflicts = 0;
    let mut proposal_reference_conflicts = 0;
    let mut statistics = [Statistic::default(); 4];

    let mut note_deutsch = 1.0;
    while note_deutsch <= 6.0 {
        let mut note_mathe = 1.0;
        while note_mathe <= 6.0 {
            let mut note_hsu = 1.0;
            while note_hsu <= 6.0 {
                combination_count += 1;

                let official_average = calculate_average(
                    round_to_whole_grade(note_deutsch),
                    round_to_whole_grade(note_mathe),
                    round_to_whole_grade(note_hsu),
                );
                let proposed_average = calculate_average(
                    round_to_one_decimal(note_deutsch),
                    round_to_one_decimal(note_mathe),
                    round_to_one_decimal(note_hsu),
                );
                let reference_average =
                    calculate_average(note_deutsch, note_mathe, note_hsu);
                let official_school = determine_school(official_average);
                let proposed_school = determine_school(proposed_average);
                let reference_school = determine_school(reference_average);

                if official_average == 3.0 {
                    statistics[0].total_count += 1;
                    if reference_school != SCHOOL_MITTELSCHULE {
                        statistics[0].conflict_count += 1;
                    }
                }
                if official_average == 2.66 {
                    statistics[1].total_count += 1;
                    if reference_school == SCHOOL_GYMNASIUM {
                        statistics[1].conflict_count += 1;
                    }
                }
                if official_average == 2.33 {
                    statistics[2].total_count += 1;
                    if reference_school != SCHOOL_GYMNASIUM {
                        statistics[2].conflict_count += 1;
                    }
                }
                if official_average == 2.66 {
                    statistics[3].total_count += 1;
                    if reference_school == SCHOOL_MITTELSCHULE {
                        statistics[3].conflict_count += 1;
                    }
                }

                if official_school != reference_school {
                    official_reference_conflicts += 1;
                }
                if official_school != proposed_school {
                    official_proposal_conflicts += 1;
                }
                if proposed_school != reference_school {
                    proposal_reference_conflicts += 1;
                }

                note_hsu = normalize_grade(note_hsu + 0.01);
            }
            note_mathe = normalize_grade(note_mathe + 0.01);
        }
        note_deutsch = normalize_grade(note_deutsch + 0.01);
    }

    println!(
        "official/reference: {}%",
        percentage(official_reference_conflicts, combination_count)
    );
    println!(
        "official/proposal: {}%",
        percentage(official_proposal_conflicts, combination_count)
    );
    println!(
        "proposal/reference: {}%",
        percentage(proposal_reference_conflicts, combination_count)
    );
    for (index, statistic) in statistics.iter().enumerate() {
        println!(
            "#{}: {}% ({}/{})",
            index + 1,
            percentage(statistic.conflict_count, statistic.total_count),
            statistic.conflict_count,
            statistic.total_count
        );
    }
}

تلورانس کم در calculate_average از مقداری مانند جلوگیری می‌کند \(2{,}67\) به دلیل نمایش اعشاری دودویی آن، به اشتباه در نظر گرفته شد \(2{,}669999\ldots\) قطع شده است. normalize_grade علاوه بر این، مقدار هر حلقه را به یک شبکه مرتبه صدم کاهش می‌دهد. حداقل دو مقدار میانگین ممکن متفاوت وجود دارد. \(1/300\) جدا؛ تحملِ \(10^{-9}\) بنابراین به اندازه کافی کوچک است که هیچ مورد مرزی واقعی را تغییر ندهد.

برنامه کامپایل شده و با آن شروع می‌شود

rustc -O calc.rs && ./calc

این برنامه تمام ترکیبات \(125\,751\,501\) را بررسی کرده و برمی‌گرداند.:

مقایسهبخش
نمرات کامل در مقابل میانگین نمرات دروس گرد نشده\(10{,}4411\,\%\)
نمرات کامل در مقایسه با پروپوزال با یک رقم اعشار\(10{,}1521\,\%\)
پیشنهاد با یک رقم اعشار در مقایسه با میانگین‌های گرد نشده‌ی متخصصان\(0{,}6615\,\%\)

ارزش اصلی برای من این است \(10{,}4411\,\%\): در بیش از یک مورد از هر ده ترکیب، گرد کردن زودهنگام به کل نمرات منجر به نوع مدرسه محاسبه شده متفاوتی نسبت به مرجع گرد نشده می‌شود. این نسبت منحصراً اثر گرد کردن را در مدل انتخاب شده توصیف می‌کند.

تغییر به میانگین‌های تخصصی با یک رقم اعشار منجر به طبقه‌بندی متفاوتی در \(10{,}1521\,\%\) از کل موارد مدل در مقایسه با روش قبلی می‌شود. با این حال، مقایسه سوم بسیار مهم است: در مقایسه با مرجع بدون گرد کردن، روش با یک رقم اعشار تنها \(0{,}6615\,\%\) موارد انحرافی را باقی می‌گذارد. بنابراین انحراف از مرجع به میزان ... کاهش می‌یابد.

\[
1-\frac{0{,}6615}{10{,}4411}\approx 93{,}7\,\%.
\]

این، از نظر من، دقیقاً پیامد سوال‌برانگیز روش محاسبه فعلی است: دستاوردهای مفروض مربوط به هر موضوع بدون تغییر باقی می‌مانند؛ فقط نقطه زمانی که در آن گرد کردن انجام می‌شود می‌تواند نوع مدرسه محاسبه شده را تغییر دهد. اگرچه محاسبه با یک رقم اعشار این اثر را به طور کامل از بین نمی‌برد، اما آن را در مدل به میزان قابل توجهی کاهش می‌دهد.

با این حال، این ارقام به ما نمی‌گویند که واقعاً چند کودک تحت تأثیر قرار می‌گیرند. نمرات کارنامه لزوماً به صورت میانگین‌های گرد شده مکانیکی تولید نمی‌شوند، عملکرد تحصیلی نه توزیع یکنواختی دارد و نه مستقل است، و انتخاب واقعی نوع مدرسه صرفاً به این سه رقم بستگی ندارد. محاسبه من به یک سوال خاص‌تر پاسخ می‌دهد: وقتی همه ترکیبات صدم به یک اندازه محتمل هستند، گرد کردن چند وقت یکبار نمره محاسبه شده را تغییر می‌دهد؟

در نهایت، مقایسه‌ای با پست اصلی: نرخ کلی ذکر شده در آنجا، تقریباً \(10\,\%\) نزدیک به \(10{,}4411\,\%\) من است. با این حال، محاسبات من چهار مورد جداگانه را که هر کدام به صورت \(1/6 \approx 17\,\%\) برای «ترک تحصیل در دبیرستان با \(3{,}00\) »، «ترک تحصیل در دبیرستان با \(2{,}33\) »، «تحصیل در دبیرستان با \(2{,}66\) » و «تحصیل در دبیرستان با \(2{,}66\) »، به ترتیب ۱.۴۶۱۵ \(59{,}6096\,\%\) \(1{,}2023\,\%\) \(62{,}9395\,\%\) \(1{,}4615\,\%\) .

این چهار مقدار، احتمالات شرطی با گروه‌های مرجع با اندازه‌های متفاوت هستند. بدون یک فضای نمونه با تعریف متفاوت \(1/6\) را از آنها استخراج کرد. بنابراین محاسبه من اثر گرد کردن را تأیید می‌کند، اما این احتمالات فردی را تأیید نمی‌کند. در هر صورت، اظهارات مربوط به تعداد واقعی کودکان آسیب‌دیده نیاز به توزیع نمرات واقعی و وابستگی‌های آنها دارد.

بازگشت