سؤال

أنا ألعب مع مثال المسافة Euclidian من دفتر الاستخبارات الجماعية البرمجة،


# Returns a distance-based similarity score for person1 and person2 
def sim_distance(prefs,person1,person2): 
  # Get the list of shared_items 
  si={} 
  for item in prefs[person1]: 
    if item in prefs[person2]: 
       si[item]=1 
  # if they have no ratings in common, return 0 
  if len(si)==0: return 0 
  # Add up the squares of all the differences 
  sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2) 
                      for item in prefs[person1] if item in prefs[person2]]) 

هذا هو التعليمات البرمجية الأصلية لنقاد الأفلام المرتبة، أحاول تعديل هذا للعثور على مشاركات مماثلة، بناء على العلامات التي أقوم بها خريطة مثل،

url1 - > tag1 tag2
url2 - > tag1 tag3

ولكن إذا طبق هذا إلى الوظيفة،

pow(prefs[person1][item]-prefs[person2][item],2) 

يصبح هذا 0 سبب علامات لا تملك الوزن نفس العلامات ترتيب 1. قمت بتعديل التعليمات البرمجية لإنشاء فرق يدويا لاختبارها،

pow(prefs[1,2) 

ثم حصلت على الكثير من التشابه 0.5، ولكن تشابه من نفس المنشور له انخفض النفس إلى 0.3. لا أستطيع التفكير في طريقة لتطبيق مسافة Euclidian على وضعي؟

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

المحلول

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

def sim_distance(prefs, person1, person2): 
  # Get the list of shared_items
  p1, p2 = prefs[person1], prefs[person2]
  si = set(p1).intersection(set(p2))

  # Add up the squares of all the differences 
  matches = (p1[item] - p2[item] for item in si)
  return sum(a * a for a in matches) 

بعد ذلك، يحتاج المنشور الخاص بك إلى القليل من التحرير للوضوح. أنا لا أعرف ما يعنيه هذا: "هذا يصبح 0 يسبب علامات لا تملك الوزن نفس العلامات ترتيب 1."

أخيرا، سيساعد ذلك إذا قدمت بيانات عينة prefs[person1] و prefs[person2]. وبعد ثم يمكنك معرفة ما تحصل عليه وما تتوقع الحصول عليه.

تحرير: بناء على تعليقي أدناه، أود استخدام رمز مثل هذا:

def sim_distance(prefs, person1, person2):
    p1, p2 = prefs[person1], prefs[person2]
    s, t = set(p1), set(p2)
    return len(s.intersection(t)) / len(s.union(t))

نصائح أخرى

أساسا، لا تحتوي العلامات على أوزان ولا يمكن تمثيلها بالقيم العددية. لذلك لا يمكنك تحديد المسافة بين علامتين.

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

url1 -> tag1 tag2 tag3 tag4
url2 -> tag1 tag4 tag5 tag6

ثم لديك 2 علامات مماثلة، تمثل 2 (similar tags) / 4 (total tags) = 0.5. وبعد أعتقد أن هذا سيمثل قياسا جيدا للتشابه، طالما أن لديك أكثر من علامتين لكل وظيفة.

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