إنشاء مصفوفة المسافة باستخدام نباراي مع بدست و سكويرفورم

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

سؤال

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

هذه هي بيانات الإدخال الخاصة بي ، صفيف نب (ريسولتاراي).

[[ 53.3252628   -6.2644198 ]
[ 53.3287395   -6.2646543 ]
[ 53.33321202  -6.24785807]
[ 53.3261015   -6.2598324 ]
[ 53.325291    -6.2644105 ]
[ 53.3281323   -6.2661467 ]
[ 53.3253074   -6.2644483 ]
[ 53.3388147   -6.2338417 ]
[ 53.3381102   -6.2343826 ]
[ 53.3253074   -6.2644483 ]
[ 53.3228188   -6.2625379 ]
[ 53.3253074   -6.2644483 ]]

وهذا هو سطر الكود الذي يخطئ.

distance_matrix = sp.spatial.distance.squareform(sp.spatial.distance.pdist
(ResultArray,(lambda u,v: haversine(u,v))))

هذه هي رسالة الخطأ:

File "Location.py", line 48, in <module>
distance_matrix = sp.spatial.distance.squareform(sp.spatial.distance.pdist
(ResArray,(lambda u,v: haversine(u,v))))
File "/usr/lib/python2.7/dist-packages/scipy/spatial/distance.py", line 1118, in pdist
dm[k] = dfun(X[i], X[j])
File "Location.py", line 48, in <lambda>
distance_matrix = sp.spatial.distance.squareform(sp.spatial.distance.pdist
(ResArray,(lambda u,v: haversine(u,v))))
TypeError: 'module' object is not callable

أنا استيراد سسيبي كما سب.(استيراد سسيبي كما سب )

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

المحلول

يرجى الرجوع إلى @توماسوف الجواب.هذه الإجابة خاطئة: pdist يسمح لاختيار وظيفة المسافة المخصصة.سأحذف الإجابة بمجرد عدم اختيارها كإجابة صحيحة.

ببساطة scipyفي pdist لا يسمح بالمرور في وظيفة المسافة المخصصة.كما يمكنك أن تقرأ في المستندات, ، لديك بعض الخيارات ، ولكن المسافة الجانبية ليست ضمن قائمة المقاييس المدعومة.

(ماتلاب pdist هل يدعم الخيار على الرغم من ذلك ، انظر هنا)

تحتاج إلى إجراء الحساب "يدويا" ، أي.مع الحلقات ، سيعمل شيء من هذا القبيل:

from numpy import array,zeros

def haversine(lon1, lat1, lon2, lat2):
    """  See the link below for a possible implementation """
    pass

#example input (your's, truncated)
ResultArray = array([[ 53.3252628, -6.2644198 ],
                     [ 53.3287395  , -6.2646543 ],
                     [ 53.33321202 , -6.24785807],
                     [ 53.3253074  , -6.2644483 ]])

N = ResultArray.shape[0]
distance_matrix = zeros((N, N))
for i in xrange(N):
    for j in xrange(N):
        lati, loni = ResultArray[i]
        latj, lonj = ResultArray[j]
        distance_matrix[i, j] = haversine(loni, lati, lonj, latj)
        distance_matrix[j, i] = distance_matrix[i, j]

print distance_matrix
[[ 0.          0.38666203  1.41010971  0.00530489]
 [ 0.38666203  0.          1.22043364  0.38163748]
 [ 1.41010971  1.22043364  0.          1.40848782]
 [ 0.00530489  0.38163748  1.40848782  0.        ]]

للاشارة فقط ، يمكن العثور على تنفيذ في بيثون من هافرسايد هنا.

نصائح أخرى

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

giveacodicetagpre.
giveacodicetagpre.

هنا أبلغ عن إصدار الرمز الملهم في التعليمات البرمجية من هذا رابط :

giveacodicetagpre.

واتصل بالطريقة التالية:

giveacodicetagpre.

في تطبيق MASTRIX A يحتوي على كود أول قيم خط الطول وكعمدا ثانيا يتم التعبير عن قيم خطوط العرض بالدرجات العشرية.

يمكنك الآن تجميع بيانات خطوط الطول والعرض المكانية باستخدام مقياس دبسكان و هافرسين سكيت-تعلم دون حساب مصفوفة المسافة باستخدام سسيبي.

db = DBSCAN(eps=2/6371., min_samples=5, algorithm='ball_tree', metric='haversine').fit(np.radians(coordinates))

هذا يأتي من هذا البرنامج التعليمي على تجميع البيانات المكانية مع سكيت-تعلم دبسكان.على وجه الخصوص ، لاحظ أن eps القيمة 2 كم مقسومة على 6371 (نصف قطر الأرض بالكيلومتر) لتحويلها إلى راديان.أيضا ، لاحظ أن .fit() يأخذ الإحداثيات بوحدات راديان لمقياس هافرسين.

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