وزنهای ضربی (اکثریت وزندار)
از چند «کارشناس» پیشبینی میگیرد و طبق رأی وزندار آنها پیشبینی میکند؛ هر کارشناسی که اشتباه کرد وزنش ضربدر (1 − ε) میشود. تعداد اشتباهها حداکثر حدود ۲ برابر بهترین کارشناس به اضافهی O(log n/ε) است.
هر روز باید چیزی را پیشبینی کنیم (مثلاً «فردا باران میآید؟»). n کارشناس هر کدام پیشبینی خودشان را میدهند و نمیدانیم کدام بهتر است. میخواهیم در طول زمان تقریباً به خوبی بهترین کارشناس عمل کنیم، بی آنکه از قبل بدانیم کیست.
- زمان:
O(n) per round - حافظه:
O(n) - CLRS، بخش ۳۳.۲
سه کارشناس در ده دور؛ کارشناس ۳ همیشه درست میگوید. ε = ۰٫۵: بعد از چند اشتباه اول، رأی او غالب میشود.
def weighted_majority(R, eps):# Each row of R is one round: the experts' predictions (0 or 1), then what really happened in the last column.# eps is in hundredths: a wrong expert's weight is multiplied by 1 - eps/100.beta = 1 - eps / 100n = len(R[0]) - 1weight = [1.0] * nmistakes = 0expert_mistakes = [0] * nrows = [] # for the picture: round, our prediction, the truth, the weights after the roundfor t in range(len(R)):votes = R[t][:n]truth = R[t][n]one = sum(weight[i] for i in range(n) if votes[i] == 1)zero = sum(weight[i] for i in range(n) if votes[i] == 0)guess = 1 if one >= zero else 0if guess != truth:mistakes = mistakes + 1for i in range(n):if votes[i] != truth:expert_mistakes[i] = expert_mistakes[i] + 1weight[i] = round(weight[i] * beta, 4)rows.append([t + 1, guess, truth, list(weight)])best = min(expert_mistakes)return [mistakes, best]
شروع اجرا
جدول هنوز خالی است.
متغیرهای محلی
نارنجی = در همین گام عوض شد
R list
Call stack
- weighted_majority()خط 1
توضیح
مسئله
هر روز باید چیزی را پیشبینی کنیم (مثلاً «فردا باران میآید؟»). n کارشناس هر کدام پیشبینی خودشان را میدهند و نمیدانیم کدام بهتر است. میخواهیم در طول زمان تقریباً به خوبی بهترین کارشناس عمل کنیم، بی آنکه از قبل بدانیم کیست.
الگوریتم اکثریت وزندار
همهی کارشناسها با وزن ۱ شروع میکنند. هر دور:
- طبق رأی وزندار پیشبینی کن.
- وقتی جواب معلوم شد، وزن هر کارشناسی که اشتباه کرد را در
1 − εضرب کن.
ضمانت
اگر بهترین کارشناس m* اشتباه کند، تعداد اشتباههای ما حداکثر
2(1 + ε) m* + (2 ln n) / ε
است. هر بار که ما اشتباه میکنیم، حداقل نیمی از وزن کل اشتباه کرده، پس وزن کل کم میشود؛ ولی وزن بهترین کارشناس حداقل (1 − ε)^(m*) میماند.
همین ایدهی «وزندهی ضربی» در بازیها، برنامهریزی خطی تقریبی و تقویت (boosting) هم به کار میرود.
ورودی
هر سطر R یک دور است: پیشبینی کارشناسها (۰ یا ۱) و در ستون آخر جواب واقعی. eps به صدم است (۵۰ یعنی ۰٫۵).