بحث ویکی‌پدیا:هیئت نظارت/تحلیل بر اساس خوشه‌بندی

message: import codecs
import math
import sklearn.cluster
import matplotlib.pyplot as plt
period = '1st'
x = [(39,4,43), (34,4,38), (39,7, 46), (31,7, 38), (30, 6, 36), (26, 10, 36), (24, 12, 36), (22, 9, 31), (20, 9, 29)]
#x = [[43], [38], [46], [38], [36], [36], [36], [31], [29]]
c = 0
print(x)
def mean_func(gen):
    mean = 0
    c = 0
    if not gen:
        return 0
    for case in gen:
        c += 1
        mean += case
    return mean/float(c)
def std(gen, mean=None):
    if not gen:
        return 0
    if not mean:
        mean = mean_func(gen)
    variance = 0
    c = 0
    for case in gen:
        c += 1
        variance += (case - mean)**2
    return math.sqrt(variance / float(c))
x_for_scaling = {}
for case in x:
    for i in range(len(case)):
        x_for_scaling[i] = x_for_scaling.get(i, []) + [case[i]]
mean_and_std = {}
for i in x_for_scaling:
    mean = mean_func(x_for_scaling[i])
    std_var = std(x_for_scaling[i], mean)
    mean_and_std[i] = (mean, std_var)
training_set = []
for case in x:
    new_case = []
    for i in range(len(case)):
        new_case.append((case[i] - mean_and_std[i][0])/mean_and_std[i][1])
    training_set.append(tuple(new_case))
#training_set = x[:]
#print(training_set)
cost_function = {}
res_for_plot = []
for n in range(1, 5):
    classi = sklearn.cluster.KMeans(n_clusters=n)
    res = classi.fit_transform(list(training_set))
    cost_temp = 0
    for case in res:
        cost_temp += min(case)
    cost_function[n] = cost_temp / len(res)
    res_for_plot.append(cost_function[n])
    if n == 2:
        #print(classi.cluster_centers_)
        print(classi.labels_)
print(cost_function)
for i in range(3):
    print i+2,'-', i+1, ':', cost_function[i+2] - cost_function[i+1]
#plt.plot(list(range(1, 5)), res_for_plot)
#plt.ylabel('Cost function')
#plt.xlabel('Number of clusters')
#plt.title('Cost function per number of clusters in %s arb com election' % period)
#plt.show()
thread_title:  کد 

message: ===اول===
[(39, 4, 43), (34, 4, 38), (39, 7, 46), (31, 7, 38), (30, 6, 36), (26, 10, 36), (24, 12, 36), (22, 9, 31), (20, 9, 29)]
[0 0 0 0 0 1 1 1 1]
{1: 1.5896873535410334, 2: 0.96108954206747221, 3: 0.70777366569967848, 4: 0.48554724701030288}
2 - 1 : -0.628597811474
3 - 2 : -0.253315876368
4 - 3 : -0.222226418689
===دوم===
[(28, 0, 28), (35, 5, 40), (26, 4, 30), (23, 3, 26), (32, 6, 38), (22, 5, 27), (33, 9, 42), (29, 9, 38), (36, 12, 48), (15, 5, 20), (15, 6, 21), (23, 12, 35), (11, 8, 19), (8, 6, 15), (8, 3, 11)]
[1 0 1 1 0 1 0 0 0 1 1 0 1 1 1]
{1: 1.6108496743230623, 2: 1.0185892964392151, 3: 0.74700950975173741, 4: 0.62684542669354548}
2 - 1 : -0.592260377884
3 - 2 : -0.271579786687
4 - 3 : -0.120164083058
===سوم===
[[40, 0, 40], [38, 1, 39], [35, 1, 36], [39, 3, 42], [37, 3, 40], [29, 3, 32], [26, 6, 32], [14, 1, 15], [6, 2, 8], [12, 5, 17], [5, 7, 12]]
[0 0 0 0 0 0 0 1 1 1 1]
{1: 1.6310622517061801, 2: 0.96372147087542015, 3: 0.71153208566691084, 4: 0.57776227052566131}
2 - 1 : -0.667340780831
3 - 2 : -0.252189385209
4 - 3 : -0.133769815141
===چهارم===
[[31, 1, 32], [33, 2, 35], [32, 4, 36], [26, 5, 31], [25, 5, 30], [20, 4, 24], [17, 3, 20], [8, 2, 10], [13, 6, 19], [8, 4, 12], [6, 4, 10], [4, 5, 9], [5, 10, 15]]
[1 1 1 1 1 1 0 0 0 0 0 0 0]
{1: 1.5827384087073832, 2: 1.0041196191606458, 3: 0.77541973935132191, 4: 0.57276281075620339}
2 - 1 : -0.578618789547
3 - 2 : -0.228699879809
4 - 3 : -0.202656928595
===پنجم===
[[39, 3, 42], [27, 3, 30], [32, 4, 36], [28, 5, 33], [27, 5, 32], [31, 7, 38], [21, 4, 25], [20, 6, 26], [20, 8, 28], [15, 8, 23], [16, 10, 26]]
[1 1 1 1 1 1 0 0 0 0 0]
{1: 1.5702175977819637, 2: 0.98532266182387562, 3: 0.81551397339131204, 4: 0.59829986780182753}
2 - 1 : -0.584894935958
3 - 2 : -0.169808688433
4 - 3 : -0.217214105589
thread_title: نتیجه

message: [(39, 4, 43), (34, 4, 38), (39, 7, 46), (31, 7, 38), (30, 6, 36), (26, 10, 36), (24, 12, 36), (22, 9, 31), (20, 9, 29)]
[0 0 0 0 0 1 1 1 1]
{1: 1.5896873535410334, 2: 0.96108954206747221, 3: 0.70777366569967848, 4: 0.48554724701030288}
2 - 1 : -0.628597811474
3 - 2 : -0.253315876368
4 - 3 : -0.222226418689
thread_title: اول

message: [(28, 0, 28), (35, 5, 40), (26, 4, 30), (23, 3, 26), (32, 6, 38), (22, 5, 27), (33, 9, 42), (29, 9, 38), (36, 12, 48), (15, 5, 20), (15, 6, 21), (23, 12, 35), (11, 8, 19), (8, 6, 15), (8, 3, 11)]
[1 0 1 1 0 1 0 0 0 1 1 0 1 1 1]
{1: 1.6108496743230623, 2: 1.0185892964392151, 3: 0.74700950975173741, 4: 0.62684542669354548}
2 - 1 : -0.592260377884
3 - 2 : -0.271579786687
4 - 3 : -0.120164083058
thread_title: دوم

message: [[40, 0, 40], [38, 1, 39], [35, 1, 36], [39, 3, 42], [37, 3, 40], [29, 3, 32], [26, 6, 32], [14, 1, 15], [6, 2, 8], [12, 5, 17], [5, 7, 12]]
[0 0 0 0 0 0 0 1 1 1 1]
{1: 1.6310622517061801, 2: 0.96372147087542015, 3: 0.71153208566691084, 4: 0.57776227052566131}
2 - 1 : -0.667340780831
3 - 2 : -0.252189385209
4 - 3 : -0.133769815141
thread_title: سوم

message: [[31, 1, 32], [33, 2, 35], [32, 4, 36], [26, 5, 31], [25, 5, 30], [20, 4, 24], [17, 3, 20], [8, 2, 10], [13, 6, 19], [8, 4, 12], [6, 4, 10], [4, 5, 9], [5, 10, 15]]
[1 1 1 1 1 1 0 0 0 0 0 0 0]
{1: 1.5827384087073832, 2: 1.0041196191606458, 3: 0.77541973935132191, 4: 0.57276281075620339}
2 - 1 : -0.578618789547
3 - 2 : -0.228699879809
4 - 3 : -0.202656928595
thread_title: چهارم

message: [[39, 3, 42], [27, 3, 30], [32, 4, 36], [28, 5, 33], [27, 5, 32], [31, 7, 38], [21, 4, 25], [20, 6, 26], [20, 8, 28], [15, 8, 23], [16, 10, 26]]
[1 1 1 1 1 1 0 0 0 0 0]
{1: 1.5702175977819637, 2: 0.98532266182387562, 3: 0.81551397339131204, 4: 0.59829986780182753}
2 - 1 : -0.584894935958
3 - 2 : -0.169808688433
4 - 3 : -0.217214105589
thread_title: پنجم

message: #من از feature scaling استفاده کردم به این معنی که وزن هر feature (موافقان، مخالفان، مجموع) یکسان خواهد بود. بدون فیچر اسکیلینگ هم می‌توان انجام داد ولی فرق زیادی نخواهد داشت.
#زمانی که تعداد خوشه‌ها کم است استفاده از init رندوم مشکل خواهد داشت. در این سیستم از init k++ استفاده کردم که از جزئیاتش اطلاع ندارم. در این موارد می‌توان init رندوم را گذاشت و ده تا صد بار انجام داد سپس آنی را انتخاب کرد که کمترین cost function را دارد. برای جمع‌بندی این دوره حتما این کار را خواهم کرد.
# در خوشه‌بندی چیزی تحت نام رتبه‌بندی در خود خوشه‌ها نداریم پس باید از درصد اجماع استفاده شود. می‌توان از فاصله تا مرکز خوشه رتبه‌بندی ساخت ولی قطعا منطقی نیست. 
چند نتیجه‌گیری:
# خوشه کردن کاربران به دو دسته بهترین گزینه است.
# این خوشه‌بندی خروجی یکسانی با تمام جمع‌بندی‌ها می‌دهد به جز جمع‌بندی دوره دوم که ایرانی، سورنا، این فکت و ساههکو عدم مشارکت کافی باید می‌شدند که نشدند و دوره اول که مردتنها و آبتین باید عدم مشارکت کافی می‌شدند که نشدند.
# این متد عالی است به شدت موافقش هستم.
ارادتمند:)امیرΣυζήτηση  ‏۳۱ اوت ۲۰۱۵، ساعت ۱۴:۳۸ (UTC)
replies: text: ممنون بابت این تحلیل. به نظرم insight خوبی به نتایج می‌دهد. اما مشکلی که می‌تواند پیش آید این است که داده ممکن است خوشه‌خوشه نباشد. در آن صورت خوشه‌بندی معمولاً داده را نصف می‌کند و تحلیل نتیجه سخت خواهد بود.

text: نکته‌ای که به نظرم می‌رسد این است که چون جامعهٔ ویکی کوچک است، ما باید نوعی نظام انتخاباتی برگزینیم که بیشترین اطلاعات را از هر کاربر رای دهنده بیرون بکشد.  به عنوان مثال از آنان بخواهیم به هر نامزد یک نمره بین ۱ تا ۱۰ بدهد یا آن‌ها را به ترتیب ترجیحش رتبه‌بندی کند. در این صورت دقت انتخابات بالاتر می‌تواند برود. با تشکر، طاها (بحث) ‏۱ سپتامبر ۲۰۱۵، ساعت ۰۱:۰۵ (UTC)
replies: text: :از نظر فنی با نظر طاها موافقم، به ویژه دومین پیشنهاد. با افزایش تعداد داده‌ها اریبی کاهش می‌یابد. ولی از نظر اجرایی به نظرم چندان عملی نباشد. مهدی (بحث) ۱۰ شهریور ۱۳۹۴، ساعت ۲۲:۳۰ (ایران) ‏۱ سپتامبر ۲۰۱۵، ساعت ۱۸:۰۰ (UTC)
از طریق تغییرات cost function می‌توان فهمید که داده‌ها خوشه خوشه است یا نه. :)امیرΣυζήτηση  ‏۱ سپتامبر ۲۰۱۵، ساعت ۱۶:۱۱ (UTC)
 طاها جان تحلیل را دقیق بخوان من تحلیل را بین یک خوشه تا پنج خوشه انجام داده‌ام و خروجی آن چیزی است که مشاهده می‌کنید و بر اساس آن خوشه کردن به دو (k=2) بهترین نتیجه است به ما یا از نظر فنی elbowی ما در آنجا قرار دارد و قطعا می‌توان چنین تحلیلی را روی انتخابات‌های آینده نیز انجام داد و اگر دیدیم که دو خوشه مناسب نیست از این متد استفاده نکنیم. روش دیگری که بسیار دقیق‌تر از این متد است (این روش در سال ۲۰۱۲ مطرح شده‌است) وجود دارد که بر اساس :en:p-value کار می‌کند و در حال استفاده‌اش در پروژه‌ام در بنیاد هستم و هر وقت آماده شد روی این سیستم آماری هم اجرایش می‌کنم تا نتیجه نهایی را به شما بدهم. :)امیرΣυζήτηση  ‏۴ سپتامبر ۲۰۱۵، ساعت ۰۱:۴۸ (UTC)

text: منظورم این بود که اگر در یک انتخابات داده‌ها به طور طبیعی خوشه‌بندی نداشته باشند، این روش می‌تواند نتیجهٔ دلخواه را ندهد.

text: روش مبنی بر پی‌-مقدار شما با روش مبنی بر بازهٔ اطمینانی که من در اینجا توضیح داده‌ام احیاناً شبیه نیست؟

text: راستش روش مبنی بر خوشه‌بندی به نظرم کاملاً make sense می‌کند. فقط باید فکر کنیم کی کار نمی‌کند. مثلاً این مورد را در نظر بگیرید: دو نفر اول خیلی خوب رای می‌آورند. بعد بقیه رای‌هایشان متوسط است.  در این حالت خوشه‌بندی یک خوشهٔ با دو نفر اول می‌دهد و یک خوشه بقیه. طاها (بحث) ‏۴ سپتامبر ۲۰۱۵، ساعت ۰۲:۴۱ (UTC)

text: خب اگر داده‌ها به طور طبیعی خوشه‌بندی نداشته باشند به طور خودکار سیستم p-value (ویا cost function) دلخواه را در k=2 نمی‌دهد و می‌توان از آن استفاده نکرد. در مورد اینکه می‌گویید که اگر دو نفر خوب باشند و بقیه متوسط به نظرم حرفتان اشتباه است چرا از مشکلات استفاده از k-means کور «اثر میکی‌ماوسی» است بدین معنی که اگر ما بدون توجه به p-value و cost function همین خوشه‌بندی را برانیم خوشه اول شامل دو نفر اول و چهار پنج نفر از متوسط می‌شود و بقیه را می‌فرستد به خوشه دوم ولی باز هم می‌گویم همه این اشکالات ممکن است رخ دهد ولی به راحتی می‌توان فهمید که چنین چیزی کی رخ می‌دهد و در آن مواقع از آن استفاده نکرد. موردی که برایم سوال است این است که شما در ضریب مقبولیت فرض می‌کنید توزیع داده‌ها گاوسی است. آیا این فرض من صحیح است؟ اگر صحیح است که خب مشکل جدی خواهیم داشت. داده‌های انتخابات‌های هیئت نظارت گاوسی نیستند. دلیل استفاده از k-means هم همین است. ارادتمند :)امیرΣυζήτηση  ‏۴ سپتامبر ۲۰۱۵، ساعت ۰۴:۰۱ (UTC)
replies: text: : خب، اگر قرار باشد اینقدر انسان را در فرآیند یادگیری دخالت دهیم، من روشی براساس Ensemble learning پیشنهاد می‌کنم که احتمالاً از روش فوق بهتر کار می‌کند:

text: :* ما ۵-۶ دیوانسالار عاقل و عادل داریم و خوشه‌بندی ۱۰-۱۲ نقطه در فضای ۲-۳ بعدی کار سختی نیست. از ایشان بخواهیم تکی داده را به ۲ خوشه تقسیم کنند. و خوشه‌بندی اصلی را براساس اجماع خوشه‌بندی دیوانسالاران تشکیل می‌دهیم.

text: :ایراد اصلی‌ای که به روش‌های unsupervised مانند خوشه‌بندی فوق وارد است این است که هر کسی یک خوشه‌بندی می‌کند و با آن راضی می‌شود و راه خیلی مدونی  برای مقایسهٔ خوشه‌بندی‌ها وجود ندارد. این بخشی از کتاب Machine Learning‌ نوشتهٔ Murphy به سال ۲۰۱۲ است (فصل ۲۵.۱.۲، صفحهٔ ۸۷۶):
The validation of clustering structures is the most difficult and frustrating part of cluster
analysis. Without a strong effort in this direction, cluster analysis will remain a black art
accessible only to those true believers who have experience and great courage. — Jain
and Dubes (Jain and Dubes 1988)

text: :خوشه‌بندی ابزار بسیار خوبی برای تحلیل داده مثلاً در یک شرکت است. ولی برای تصمیم‌گیری‌هایی حساس مانند نتیجهٔ انتخابات شاید rigor کافی نداشته باشد.

text: :در نهایت، من جزئیات روش p-value شما رو نمی‌دونم، ولی با توجه به سایز کوچک دادهٔ ما، شاید نتیجهٔ دلخواه رو نگیرید. طاها (بحث) ‏۴ سپتامبر ۲۰۱۵، ساعت ۱۲:۲۷ (UTC)
thread_title:  بحث و نکات فنی