اذهب إلى المحتوى
  • 0

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

Amer Abdallah

السؤال

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

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

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

 

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

Recommended Posts

  • 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

 

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

  • 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 صائب

 

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

  • 0

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

import numpy as np

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

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

 

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...