حساب المعلومات المتبادلة لاختيار مجموعة تدريب في جافا

StackOverflow https://stackoverflow.com/questions/2002521

سؤال

سيناريو


أحاول تنفيذ التعلم الخاضع للإشراف على مجموعة بيانات ضمن تطبيق Java Gui. سيتم إعطاء المستخدم قائمة بالعناصر أو "التقارير" لفحصها وسيقوم بتسميةها بناء على مجموعة من الملصقات المتاحة. بمجرد اكتمال التعلم الخاضع للإشراف، سيتم بعد ذلك إعطاء مثيلات المسمى لخوارزمية التعلم. سيحاول ذلك طلب بقية العناصر حول مدى احتمال أن المستخدم سوف يرغب المستخدم في عرضها.

للحصول على أكثر من وقت المستخدم، أرغب في تحديد التقارير التي ستوفر معظم المعلومات حول المجموعة بأكملها من التقارير، ولديها المستخدم تسميةها. كما أفهمها، لحساب ذلك، سيكون من الضروري العثور على مجموع جميع قيم المعلومات المتبادلة لكل تقرير، وطلب منهم بهذه القيمة. سيتم بعد ذلك استخدام التقارير المسماة من التعلم الإشراف لتشكيل شبكة بيئي للعثور على احتمال قيمة ثنائية لكل تقرير متفق عليه.

مثال


هنا، قد يساعد مثال مصطنع في التفسير، وقد يؤدي إلى مسح الارتباك عندما استخدمت بلا شك المصطلحات الخاطئة :-) النظر في مثال حيث يعرض التطبيق قصص إخبارية للمستخدم. يختار قصص الأخبار التي تعرض أولا بناء على تفضيل المستخدم الموضح. ميزات قصة أخبار التي لها علاقة country of origin, category أو date. وبعد لذلك إذا قام المستخدم بتصميق قصة أخبار واحدة مثيرة للاهتمام عندما جاءت من اسكتلندا، فإنها تخبر المتعلم الآلي أن هناك فرصة متزايدة قصص الأخبار الأخرى من اسكتلندا ستكون مثيرة للاهتمام للمستخدم. مماثلة لفئة مثل الرياضة، أو تاريخ مثل 12 ديسمبر 2004.

يمكن حساب هذا التفضيل عن طريق اختيار أي طلب لجميع القصص الإخبارية (على سبيل المثال حسب الفئة، حسب التاريخ) أو طلبها بشكل عشوائي، ثم حساب الأفضلية حيث يتقدم المستخدم. ما أود القيام به هو الحصول على نوع من "بداية الرأس" على الطلب من خلال الحصول على المستخدم للنظر في عدد قليل من قصص الأخبار المحددة ويقول إذا كانوا مهتمين بهم (الجزء التعليمي الخاضع للإشراف). لاختيار قصص لإظهار المستخدم، يجب أن أعتبر المجموعة بأكملها من القصص. هذا هو المكان الذي تأتي فيه المعلومات المتبادلة. لكل قصة أريد أن أعرف كم يمكن أن تخبرني عن جميع القصص الأخرى عندما يصنفها المستخدم. على سبيل المثال، إذا كان هناك عدد كبير من القصص التي نشأت من اسكتلندا، أريد الحصول على المستخدم لتصنيفها (على الأقل) أحدهم. مماثلة لميزات الارتباط الأخرى مثل الفئة أو التاريخ. الهدف هو إيجاد أمثلة على التقارير التي، عند تصنيفها، توفر معظم المعلومات حول التقارير الأخرى.

مشكلة


نظرا لأن الرياضيات الصدئة بعض الشيء، وأنا جديد في تعلم الآلة أواجه بعض المشاكل في تحويل تعريف المعلومات المتبادلة إلى التنفيذ في جافا. تصف ويكيبيديا المعادلة للحصول على المعلومات المتبادلة على النحو التالي:

mutual information equation

ومع ذلك، أنا غير متأكد إذا كان يمكن استخدام ذلك بالفعل عندما يكون هناك شيء مصنف، ولم تحسب خوارزمية التعلم أي شيء حتى الآن.

كما هو الحال في مثلي، قل لي عددا كبيرا من مثيلات جديدة غير مبينة في هذه الفئة:

public class NewsStory {
    private String countryOfOrigin;
    private String category;
    private Date date;
    // constructor, etc.
}

في سيناريو المحدد الخاص بي، يعتمد الارتباط بين الحقول / الميزات على تطابق تام لذلك، على سبيل المثال، يوم واحد و 10 سنوات الفرق في التاريخ يعادل عدم المساواة في عدم المساواة.

عوامل الارتباط (على سبيل المثال تاريخ الارتباط أكثر من الفئة؟) ليست مساوية بالضرورة، ولكن يمكن تحديدها ودائم. هل هذا يعني أن نتيجة الوظيفة p(x,y) يكون القيمة المحددة مسبقا، أو أنا خلط المصطلحات؟

السؤال (أخيرا)


كيف يمكنني الذهاب حول تنفيذ حساب المعلومات المتبادلة بالنظر إلى هذا المثال (المزيف) من القصص الإخبارية؟ المكتبات، Javadoc، أمثلة التعليمات البرمجية وما إلى ذلك هي جميع معلومات الترحيب. أيضا، إذا كان هذا النهج معيبا بشكل أساسي، يشرح السبب في أن الحال سيكون مجرد إجابة.


ملاحظة. أنا على علم بمكتبات مثل Weka و Apache Mahout، لذلك فقط ذكرها ليست مفيدة حقا بالنسبة لي. ما زلت أبحث عن الوثائق والأمثلة لكل من هذه المكتبات التي تبحث عن الأشياء على المعلومات المتبادلة على وجه التحديد. ما الذي سيساعدني حقا هو الإشارة إلى الموارد (أمثلة التعليمات البرمجية، Javadoc) حيث تساعد هذه المكتبات في المعلومات المتبادلة.

هل كانت مفيدة؟

المحلول

أنا أظن أن مشكلتك شيء مثل ...

"نظأ قائمة بالأمثلة غير المسبقة، فرز القائمة بمقدار الدقة التنبؤية للنموذج لتحسين ما إذا كان المستخدم المسمى مثالا وأضفته إلى مجموعة التدريب."

إذا كان هذا هو الحال، فلا أعتقد أن المعلومات المتبادلة هي الشيء الصحيح الذي يجب استخدامه لأنه لا يمكنك حساب MI بين مثيلتين. يعد تعريف MI من حيث المتغيرات العشوائية ومثيل فردي ليس متغيرا عشوائيا، فهذه مجرد قيمة.

يمكن أن تكون الميزات وتسمية الطبقة من المتغيرات العشوائية. وهذا هو، لديهم توزيع القيم على مجموعة البيانات بأكملها. يمكنك حساب المعلومات المتبادلة بين ميزتين، لمعرفة كيفية إعطاء ميزة "الزائدة" واحدة أخرى، أو بين ميزة واسم الفصل، للحصول على فكرة عن مقدار هذه الميزة قد تساعد التنبؤ بها. هذه هي الطريقة التي يستخدم الناس عادة المعلومات المتبادلة في مشكلة التعلم الخاضعة للإشراف.

أعتقد أن اقتراح Ferdystschenko الذي تنظر إليه في طرق التعلم النشطة هو فكرة جيدة.


ردا على تعليق Grundleckeck، سأذهب أعمق قليلا في المصطلحات باستخدام فكرته عن تشبيه كائن جافا ...

بشكل جماعي، استخدمنا مصطلح "المثيل"، "الشيء"، "التقرير" و "المثال" للإشارة إلى الكائن الذي يتم تصفقه. دعونا نفكر في هذه الأشياء كامرطات من فئة Java (لقد تركت منشئ الغليان):


class Example
{ String f1;
  String f2;
}

Example e1 = new Example("foo", "bar");
Example e2 = new Example("foo", "baz");

المصطلحات المعتادة في التعلم الآلي هي أن E1 هو مثال, ، أن جميع الأمثلة لها اثنين الميزات F1 و F2 وأنه بالنسبة ل E1، F1 يأخذ القيمة "Foo" و F2 يأخذ القيمة "الشريط". وتسمى مجموعة من الأمثلة مجموعة البيانات.

خذ جميع قيم F1 لجميع الأمثلة في مجموعة البيانات، هذه قائمة بالسلاسل، كما يمكن اعتبارها أيضا كتوزيع. يمكننا التفكير في الميزة ك متغير عشوائي وأن كل قيمة في القائمة هي عينة مأخوذة من هذا المتغير العشوائي. لذلك يمكننا، على سبيل المثال، حساب مي بين F1 و F2. سيكون pseudocode شيء مثل:

mi = 0
for each value x taken by f1:
{  sum = 0
   for each value y taken by f2:
   {  p_xy = number of examples where f1=x and f2=y
      p_x = number of examples where f1=x
      p_y = number of examples where f2=y
      sum += p_xy * log(p_xy/(p_x*p_y))
   }
   mi += sum
}

ومع ذلك، لا يمكنك حساب MI بين E1 و E2، فهي غير موجودة فقط بالطريقة.

نصائح أخرى

أعرف أن المعلومات لا تكسب فقط فيما يتعلق بأشجار القرار (DTS)، حيث في بناء DT، فإن الانقسام لجعل كل عقدة هو الجهاز الذي يزيد من كسب المعلومات. يتم تنفيذ DTS في Weka، لذلك ربما يمكنك استخدام ذلك مباشرة، على الرغم من أنني لا أعرف إذا سمحت Weka بحساب كسب المعلومات لأي انقسام معين أسفل عقدة DT.

بصرف النظر عن ذلك، إذا فهمت لك بشكل صحيح، أعتقد أن ما تحاول القيام به يشار إليه عموما باسم تعليم فعال. وبعد هناك، تحتاج أولا إلى بعض البيانات التدريبية الأولية المسمى التي يتم تغذيتها إلى خوارزمية تعلم الجهاز الخاصة بك. ثم لديك تسمية المصنف الخاصة بك مجموعة من المثيلات غير المستمرة وإرجاع قيم الثقة لكل منها. عادة ما تكون مثيلات ذات قيم الثقة الأقل عادة ما تكون الأكثر تفاعلا بالفزادة، لذلك تظهر هذه إلى Annotator بشري، ولديها تسميةها هذه يدويا، وأضفها إلى مجموعة التدريب الخاصة بك، وإعادة تدريب المصنف الخاص بك، والقيام بأكمله و مرارا وتكرارا حتى يكون المصنف الخاص بك دقة عالية بما يكفي أو حتى يتم استيفاء بعض معايير التوقف الأخرى. لذلك إذا كان هذا يعمل من أجلك، فيمكنك من حيث المبدأ استخدام أي خوارزمية ML-خوارزمية تنفذة في Weka أو أي إطار عمل آخر طالما أن الخوارزمية التي تختارها قادرة على إرجاع قيم الثقة (في حالة نهج Bayesian سيكون مجرد احتمالات) وبعد


مع سؤالك المحرر، أعتقد أنني قادم إلى فهم ما يهدف إليه. إذا كان ما تريد حساب MI، فإن إجابة Stompchicken's ورمز الزائفة لا يمكن أن يكون أكثر وضوحا في رأيي. أعتقد أيضا أن مي ليس ما تريد وأن تحاول إعادة اختراع العجلة.

دعونا تلخصوا: كنت ترغب في تدريب مصنف يمكن تحديثه من قبل المستخدم. هذه هي حالة كلاسيكية للتعلم النشط. ولكن لذلك، فأنت بحاجة إلى مصنف أولي (يمكنك فقط إعطاء بيانات عشوائية للمستخدم فقط للتسمية ولكني أعتبر هذا ليس خيارا) ومن أجل تدريب المصنف الأولي الخاص بك، تحتاج إلى مساحة صغيرة على الأقل من التدريب المسمى البيانات للتعلم الخاضع للإشراف. ومع ذلك، كل ما لديك بيانات غير مسبقة. ماذا يمكنك أن تفعل مع هذه؟

حسنا، يمكنك العنقودية لهم في مجموعات من المثيلات ذات الصلة، باستخدام أحد خوارزميات التجميع القياسية المقدمة من Weka أو بعض أداة التجميع المحددة مثل كلوت. وبعد إذا كنت الآن تأخذ X أكثر مثيلات مركزية لكل مجموعة (X اعتمادا على عدد المجموعات والصبر للمستخدم)، ولديها تسمية المستخدم لها مثيرة للاهتمام أو غير مثيرة للاهتمام، يمكنك اعتماد هذه الملصقات للحالات الأخرى هذا العنقات كذلك (أو على الأقل بالنسبة للمركزين المركزيين). Voila، الآن لديك بيانات تدريبية يمكنك استخدامها لتدريب المصنف الأولي الخاص بك وإيقاف عملية التعلم النشطة عن طريق تحديث المصنف في كل مرة يصادف المستخدم مثيل جديد مثيرا للاهتمام أم لا. أعتقد أن ما تحاول تحقيقه من خلال حساب MI متشابه بشكل أساسي ولكن قد يكون مجرد النقل الخاطئ لشحنك.

عدم معرفة تفاصيل السيناريو الخاص بك، يجب أن أعتقد أنه قد لا تحتاج حتى إلى أي بيانات مسمى على الإطلاق، إلا إذا كنت مهتما بالملصقات نفسها. فقط تجميع بياناتك مرة واحدة، دع المستخدم اختيار عنصر مثير للاهتمام له / لها من الأعضاء المركزيين في جميع المجموعات ويقترحون عناصر أخرى من المجموعات المختارة كما لو كانت مثيرة للاهتمام أيضا. تشير أيضا إلى بعض مثيلات عشوائية من مجموعات أخرى هنا وهناك، بحيث إذا حدد المستخدم أحد هذه، فقد تفترض أن المجموعة المقابلة قد تكون مثيرة للاهتمام أيضا أيضا. إذا كان هناك تناقض ويحب المستخدم بعض أعضاء المجموعة ولكن ليس بعض الآخرين من نفس الشيء، فأنت تحاول إعادة الكتابة إلى البيانات في مجموعات مميتة تميز جيدا من الأشياء السيئة. يمكن تجنب خطوة إعادة التدريب باستخدام تجميع التسلسل الهرمي من البداية والسفر إلى أسفل التسلسل الهرمي للنظام في كل أسباب الإدخال للمستخدم التناقض.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top