لنفترض أن لدي متجهين.ما الخوارزميات التي يمكنني استخدامها لمقارنتها؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

الشركة 1 لديها هذا المتجه:

['books','video','photography','food','toothpaste','burgers'] ... ...

الشركة 2 لديها هذا المتجه:

['video','processor','photography','LCD','power supply', 'books'] ... ...

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

ما هي الخوارزميات التي يمكنك استخدامها للتلاعب بهذا؟ما هي الخوارزميات التي يمكنك استخدامها والتي يمكن أن توفر بيانات قيمة لهذه الشركات، باستخدام هذه المتجهات؟

أنا جديد في مجال التنقيب عن النصوص واسترجاع المعلومات.هل يمكن لأحد أن يرشدني حول هذه المواضيع فيما يتعلق بهذا السؤال؟

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

المحلول

هل موقف مهم جدا، وأؤكد لكم، ثم سوف يقوم المقياس الحاسم على اختلاف المواقف بين نفس العناصر الموجودة في ناقلات مختلفة (يمكنك، على سبيل المثال، جمع القيم المطلقة للخلافات، أو على مربعات). القضية الكبرى التي تحتاج إلى حل هي - كم لوزن العنصر الذي هو الحاضر (ويقول انها واحدة N-ال) في ناقلات واحد، وغائبة تماما في الآخر. غير أن مسألة ثانوية نسبيا - كما لو كان هذا البند في عداد المفقودين في الواقع حق الحالي بعد تلك الفعلية، على سبيل المثال - أو صفقة حقا، كبيرة حقا؟ أن من المستحيل أن أقول دون مزيد من الفهم لمجال التطبيق الفعلي. يمكنك محاولة طرق مختلفة للتعامل مع هذه القضية ونرى ما هي النتائج التي يطلقونها على سبيل المثال حالات يهمك!

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

def makedict(avector):
  return dict((item, i) for i, item in enumerate(avector))

وبعد ذلك، للمقارنة بين هذه dicts:

def comparedicts(d1, d2):
  allitems = set(d1) | set(d2)      
  distances = [d1.get(x, len(d1)) - d2.get(x, len(d2)) for x in allitems]
  return sum(d * d for d in distances)

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

نصائح أخرى

أقترح عليك كتاب اسمه برمجة الذكاء الجماعي.
إنه كتاب جميل جدًا حول كيفية استرجاع المعلومات من بيانات بسيطة مثل هذه.هناك أمثلة التعليمات البرمجية المضمنة (في بيثون :)

يحرر:مجرد الرد على gbjbaanb:هذه هي بايثون!

a = ['books','video','photography','food','toothpaste','burgers']
b = ['video','processor','photography','LCD','power supply', 'books']
a = set(a)
b = set(b)

a.intersection(b)
    set(['photography', 'books', 'video'])

b.intersection(a)
    set(['photography', 'books', 'video'])

b.difference(a)
    set(['LCD', 'power supply', 'processor'])

a.difference(b)
    set(['food', 'toothpaste', 'burgers'])

ونلقي نظرة على المبالغة القطر

وكما ذكر MBG، والمسافة المبالغة هي بداية جيدة. انها في الأساس تعيين قناع بت لكل بند من الممكن ما إذا كان واردا في قيمة الشركات.

وعلى سبيل المثال. معجون الأسنان هو 1 لشركة A، ولكن 0 لشركة B. أنت ثم عد البتات التي تختلف بين الشركات. ويرتبط معامل JACCARD على ذلك.

وبعد المبالغة والواقع لا تكون قادرة على التقاط التشابه بين الأشياء مثل "فيديو" و "التصوير". ومن الواضح أن الشركة التي تبيع واحدة لا تبيع الآخر أيضا مع ارتفاع احتمال من الشركة التي تبيع معجون الأسنان.

لذلك، يمكنك استخدام أشياء مثل LSI (انها تستخدم أيضا للحد من الأبعاد) أو رموز مضروب (على سبيل المثال الاشياء الشبكة العصبية كما مقيدة بولتزمان آلات، Autoencoders أو Predictablity تقليل) للحصول على تمثيل أكثر إحكاما التي يمكنك بعد ذلك مقارنة باستخدام المسافة الإقليدية.

اختر رتبة كل إدخال (الرتبة الأعلى هي الأفضل) وقم بجمع المتوسطات الهندسية بين المباريات

لاثنين من المتجهات

sum(sqrt(vector_multiply(x,y)))  //multiply matches

يجب أن يكون مجموع صفوف كل قيمة على المتجه هو نفسه لكل متجه (تفضل 1) وبهذه الطريقة يمكنك إجراء مقارنة بين أكثر من 2 متجهات.

إذا قمت بتطبيق طريقة ikkebr، يمكنك العثور على كيفية تشابه a مع b

في هذه الحالة استخدم فقط

sum( b( b.intersection(a) ))

هل يمكن استخدام set_intersection الخوارزمية. ناقلات 2 يجب أن يتم فرز أول (استخدام دعوة الفرز)، ثم تمر في 4 المكررات وستحصل على جمع الظهر مع العناصر المشتركة المدرجة فيه. وهناك عدد قليل من الآخرين أن تعمل على نحو مماثل.

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