• 0

كيفية تسوية normalize مصفوفة في NumPy إلى متجه وحدة؟

أود تحويل مصفوفة Numpy إلى متجه وحدة unit vector. وبشكل أكثر تحديدًا ، أنا أبحث عن إصدار مكافئ للدالة التالية:

def normalize(v):
    norm = np.linalg.norm(v)
    if norm == 0: 
       return v
    return v / norm

هل هناك شيء من هذا القبيل في numpy؟

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

أولاً يجب أن نفهم المشكلة. ال unit vector أو متجه الوحدة هو متجه طويلته (magnitude) تساوي ال 1. وبالتالي فإن الشعاع التالي لايمثل متجه وحدة:

import numpy as np
# تعريف الشعاع التالي
v = np.array([1,3])
# حساب الطويلة
np.linalg.norm(v)
#3.1622776601683795
# إذاً ليس متجه وحدة

حيث أن التابع np.linalg.norm(x) يقوم بحساب الطويلة للشعاع. الآن إذا أردنا أن نقوم بتحويل هذا الشعاع إلى متجه وحدة فيجب أن نقوم بعملية normalizing. رياضياً فإنه لتحويل أي شعاع إلى شعاع وحدة يجب أن نقوم بقسمة جميع عناصره على طويلته، أي لتحويل الشعاع السابق يجب أن نقوم بقسمة قيمه على 3.16227766.

import numpy as np
v = np.array([1,3])
magnitude =np.linalg.norm(v)
# نقسم كل عنصر على الطويلة
v=v/magnitude 
# نختبر إذا أصبح متجه وحدة
np.linalg.norm(v) # 1.0
# نجحنا

حسناً إذا أردت أن لاتستخدم np.linalg.norm(v) يمكنك استخدام الصيغة التالية، فكما نعلم أن الطويلة هي الجذر التربيعي لمجموع مربعات قيم الشعاع:

import numpy as np
v = np.array([1,3,5,6,33])
magnitude =np.sqrt(np.sum(v**2))
# نقسم كل عنصر على الطويلة
v=v/magnitude 
# نختبر إذا أصبح متجه وحدة
np.linalg.norm(v) # 1.0
# نجحنا

كما ويمكنك استخدام مكتبة Sklearn حيث تحتوي على طرق فعالة متاحة للمعالجة المسبقة للبيانات وأدوات التعلم الآلي الأخرى. عادةً ما يستخدم التابع normalize في هذه المكتبة مع المصفوفات ثنائية الأبعاد وتوفر خيار تسوية L1 و L2. سنستخدم في الكود التالي هذه التابع مع مصفوفة 1D حيث سنقوم باستخدام الدالة ravel لتسطيح المصفوفة :

import numpy as np
from sklearn.preprocessing import normalize
v = np.array([1,3,5,6,33])
v = normalize(v[:,np.newaxis], axis=0).ravel()
# نختبر إذا أصبح متجه وحدة
np.linalg.norm(v) # 1.0
# نجحنا

,وأخيراً يمكنك استخدام الدالة الجاهزة لتحويل الشعاع إلى شعاع  وحدة بشكل مباشر من خلال المكتبة transformations:

# لتحميلها : pip install transformations
import numpy as np
import transformations as trafo
v = np.array([1,3,5,6,33])
unit_v = trafo.unit_vector(data, axis=1)
# نختبر إذا أصبح متجه وحدة
np.linalg.norm(unit_v) # 1.0

 

2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

إذا كنت تستخدم scikit-learn فيمكنك استخدام

import numpy as np
from sklearn.preprocessing import normalize

x = np.random.rand(1000)*10
norm1 = x / np.linalg.norm(x)
norm2 = normalize(x[:,np.newaxis], axis=0).ravel()
print np.all(norm1 == norm2)
# True صائب

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

 .

تمّ تعديل بواسطة Ali Haidar Ahmad

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

كطريقة ثانية، يمكن تقسم الشعاع vector (المصفوفة الأحادية) على طولها

import numpy as np

normalized_v = v / np.sqrt(np.sum(v**2))

حيث تم حساب الطول (جذر مجموع مربعات قيم الشعاع)

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن