از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
راهنمای مقیاسگذاری چند بعدی در پایتون با Scikit-Learn
سرفصلهای مطلب
معرفی
در این راهنما، ما به یک شیرجه میرویم کاهش ابعاد، جاسازی داده ها و تکنیک تجسم داده ها شناخته شده به عنوان مقیاس بندی چند بعدی (MDS).
ما از Scikit-Learn برای انجام مقیاس بندی چند بعدی استفاده خواهیم کرد، زیرا دارای یک API فوق العاده ساده و قدرتمند است. در سراسر راهنما، ما از آن استفاده خواهیم کرد Olivetti با مجموعه داده های AT&T روبرو است برای نشان دادن جاسازی داده ها در فضایی با ابعاد پایین تر.
در پایان راهنما، درک محکمی خواهید داشت روی مقیاسگذاری چند بعدی، و همچنین فراپارامترهای آن و روش تأثیر آنها بر تکنیک.
مقیاس چند بعدی چیست؟
MDS یک تکنیک غیر خطی برای جاسازی داده ها در فضایی با ابعاد پایین تر است.
این نقشه نقاط ساکن در فضایی با ابعاد بالاتر را به فضایی با ابعاد پایین تر ترسیم می کند و در عین حال فاصله بین آن نقاط را تا حد امکان حفظ می کند. به همین دلیل، فواصل جفتی بین نقاط در فضای ابعاد پایینتر با فاصله واقعی آنها مطابقت دارد.
شکل زیر نمونه ای از نقشه برداری احتمالی نقاط از فضای سه بعدی به دو بعدی و یک بعدی است. فواصل زوجی سه نقطه در فضای سه بعدی دقیقاً در فضای دو بعدی حفظ می شود اما در فضای یک بعدی نه. اگر MDS را اجرا کنیم، حداقل تفاوت بین فواصل زوجی واقعی و فواصل زوجی نقاط نگاشت شده را تضمین می کند:
MDS را می توان به عنوان یک مرحله پیش پردازش برای کاهش ابعاد در مسائل طبقه بندی و رگرسیون استفاده کرد.
به غیر از مقیاسگذاری چند بعدی، میتوانید از سایر تکنیکهای کاهش ابعاد نیز استفاده کنید، مانند تجزیه و تحلیل اجزای اصلی (PCA) یا تجزیه ارزش منفرد (SVD). اگر میخواهید در مورد هر دوی آنها بخوانید و همچنین میتوانید از آنها به نفع خود استفاده کنید، راهنمای ما برای کاهش ابعاد در پایتون با Scikit-Learn را بخوانید!
MDS نه تنها یک تکنیک موثر برای کاهش ابعاد، بلکه برای تجسم داده ها نیز می باشد. خوشهها و الگوهای یکسانی از دادههای با ابعاد بالا را در فضای با ابعاد پایینتر حفظ میکند، بنابراین میتوانید مثلاً یک مجموعه داده 5 بعدی را به یک مجموعه داده سه بعدی تبدیل کنید که میتوانید آن را بسیار راحتتر و طبیعیتر تفسیر کنید.
معمولاً اندازهگیری فاصله مورد استفاده در MDS برابر است فاصله اقلیدسیبا این حال، می توان از هر معیار عدم تشابه مناسب دیگری در هنگام اعمال MDS استفاده کرد.
دو روش اصلی برای پیاده سازی MDS وجود دارد:
- MDS متریک / MDS کلاسیک: هدف این نسخه از MDS حفظ فاصله جفتی/عدم تشابه تا حد امکان است.
- MDS غیر متریک: این روش زمانی قابل اجرا است که فقط رتبه های یک متریک عدم تشابه مشخص باشد. MDS سپس اشیاء را نقشه میکشد تا رتبهها تا حد امکان حفظ شوند.
انجام مقیاسگذاری چند بعدی در پایتون با Scikit-Learn
کتابخانه Scikit-Learn sklearn.manifold
ماژول تکنیک های یادگیری چندگانه و جاسازی داده ها را پیاده سازی می کند. ما از MDS
کلاس این ماژول تعبیه ها با استفاده از به حداقل رساندن استرس با استفاده از عمده سازی (SMACOF) الگوریتم برخی از پارامترهای مهم برای راه اندازی MDS
اشیاء عبارتند از (این لیست جامعی نیست):
n_components
: تعداد ابعاد برای نگاشت نقاط. مقدار پیش فرض 2 است.metric
: یک متغیر بولی با مقدار پیش فرضTrue
برای MDS متریک وFalse
برای نسخه غیر متریک آنdissimilarity
: مقدار پیش فرض استeuclidean
، که فاصله های زوج اقلیدسی را مشخص می کند. مقدار ممکن دیگر این استprecomputed
. استفاده کردنprecomputed
نیاز به محاسبه ماتریس فاصله زوجی و استفاده از این ماتریس به عنوان ورودی برایfit()
یاfit_transform()
تابع.
چهار صفت مرتبط با an MDS
موضوع عبارتند از:
embedding_
: محل قرارگیری نقاط در فضای جدید.stress_
: آماره خوب بودن تناسب مورد استفاده در MDS.dissimilarity_matrix_
: ماتریس فواصل زوجی/عدم تشابه.n_iter_
: تعداد تکرارهای مربوط به بهترین معیار مناسب بودن.
مانند تمام کلاس های دیگر برای کاهش ابعاد در scikit-learn
، MDS
کلاس را نیز پیاده سازی می کند fit()
و fit_transform()
مواد و روش ها.
یک تصویر ساده
در این بخش روش اعمال MDS را با استفاده از یک مثال بسیار ساده نشان می دهیم. را اضافه می کنیم import بخش اول:
from sklearn.manifold import MDS
from matplotlib import pyplot as plt
import sklearn.datasets as dt
import seaborn as sns
import numpy as np
from sklearn.metrics.pairwise import manhattan_distances, euclidean_distances
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
کد زیر یک را تنظیم می کند MDS
شی و متد آن را فراخوانی می کند fit_transform()
. این روش نقاط تعبیه شده را در فضای دوبعدی برمی گرداند. اجازه دهید print نقشه برداری حاصل:
X = np.array(((0, 0, 0), (0, 0, 1), (1, 1, 1), (0, 1, 0), (0, 1, 1)))
mds = MDS(random_state=0)
X_transform = mds.fit_transform(X)
print(X_transform)
(( 0.72521687 0.52943352)
( 0.61640884 -0.48411805)
(-0.9113603 -0.47905115)
(-0.2190564 0.71505714)
(-0.21120901 -0.28132146))
از آنجایی که تعبیه ها بر اساس ایجاد می شوند روی الگوریتم به حداقل رساندن استرس، ما همچنین می توانیم نگاهی به آن بیندازیم stress
متغیر:
stress = mds.stress_
print(stress)
این نتیجه در:
0.18216844548575467
روش دیگر اعمال MDS با ساخت ماتریس فاصله و اعمال MDS به طور مستقیم بر روی این ماتریس همانطور که در کد زیر نشان داده شده است. این روش زمانی مفید است که اندازه گیری فاصله ای غیر از فاصله اقلیدسی مورد نیاز باشد. کد زیر جفتی را محاسبه می کند فاصله های منهتن (به آن فاصله بلوک شهر یا فاصله L1 نیز گفته می شود) و داده ها را از طریق MDS تبدیل می کند.
توجه داشته باشید که dissimilarity
آرگومان تنظیم شده است precomputed
:
dist_manhattan = manhattan_distances(X)
mds = MDS(dissimilarity='precomputed', random_state=0)
X_transform_L1 = mds.fit_transform(dist_manhattan)
این نتیجه در:
(( 0.9847767 0.84738596)
( 0.81047787 -0.37601578)
(-1.104849 -1.06040621)
(-0.29311254 0.87364759)
(-0.39729303 -0.28461157))
اگرچه، این به ما کمک نمیکند که شهود خوبی نسبت به آنچه که اتفاق افتاده است به دست آوریم. انسان ها در اعداد و ارقام آنقدر خوب نیستند. برای به دست آوردن درک بهتر از کل process، اجازه دهید نقاط اصلی و جاسازی های آنها را که با حفظ فواصل اقلیدسی ایجاد شده است ترسیم کنیم. یک نقطه اصلی و نقطه تعبیه شده مربوط به آن هر دو به یک رنگ نشان داده شده اند:
colors = ('r', 'g', 'b', 'c', 'm')
size = (64, 64, 64, 64, 64)
fig = plt.figure(2, (10,4))
ax = fig.add_subplot(121, projection='3d')
plt.scatter(X(:,0), X(:,1), zs=X(:,2), s=size, c=colors)
plt.title('Original Points')
ax = fig.add_subplot(122)
plt.scatter(X_transform(:,0), X_transform(:,1), s=size, c=colors)
plt.title('Embedding in 2D')
fig.subplots_adjust(wspace=.4, hspace=0.5)
plt.show()
طرح روی سمت راست فواصل نسبی را به طور کلی دست نخورده نگه می دارد – بنفش، سبز و آبی نزدیک به هم هستند و موقعیت نسبی آنها نسبت به یکدیگر در مقایسه با فیروزه ای و قرمز تقریباً یکسان است.
مقیاس بندی چند بعدی عملی روشن است Olivetti Faces Dataset از AT&T
به عنوان یک تصویر عملی از MDS، ما از آن استفاده خواهیم کرد Olivetti با مجموعه داده های AT&T روبرو است برای نشان دادن جاسازی ها در فضایی با ابعاد کمتر از 2 بعدی. مجموعه داده دارای 10 تصویر بیت مپ 64×64 برای هر نفر است که هر تصویر با حالات چهره یا شرایط نوری متفاوت به دست آمده است.
MDS الگوها را در داده ها حفظ می کند تا تصاویر چهره های مختلف از همین افراد در فضای دوبعدی به یکدیگر نزدیک هستند و از چهره ترسیم شده شخص دیگری دور هستند.
برای جلوگیری از بهم ریختگی، فقط چهره 4 فرد متمایز را می گیریم و MDS را روی آنها اعمال می کنیم.
قبل از واکشی مجموعه داده و اعمال MDS، اجازه دهید یک تابع کوچک بنویسیم، mapData()
، که آرگومان های ورودی را می گیرد، یعنی ماتریس فاصله زوجی dist_matrix
، ماتریس داده های خام X
، متغیر کلاس y
، متغیر بولی metric
و title
برای نمودار
این تابع MDS را به ماتریس فاصله اعمال می کند و نقاط تبدیل شده را در فضای دو بعدی نمایش می دهد، با همان نقاط رنگی که تصویر نقشه برداری شده از همان شخص را نشان می دهد. در شکل دوم، تصویر هر چهره را نیز نمایش می دهد روی نموداری که در آن در فضای با ابعاد پایین نگاشت شده است.
ما MDS را با معیارهای فاصله متفاوت همراه با MDS غیر متریک نشان خواهیم داد:
def mapData(dist_matrix, X, y, metric, title):
mds = MDS(metric=metric, dissimilarity='precomputed', random_state=0)
pts = mds.fit_transform(dist_matrix)
fig = plt.figure(2, (15,6))
ax = fig.add_subplot(1,2,1)
ax = sns.scatterplot(x=pts(:, 0), y=pts(:, 1),
hue=y, palette=('r', 'g', 'b', 'c'))
ax = fig.add_subplot(1,2,2)
plt.scatter(pts(:, 0), pts(:, 1))
for x, ind in zip(X, range(pts.shape(0))):
im = x.reshape(64,64)
imagebox = OffsetImage(im, zoom=0.3, cmap=plt.cm.gray)
i = pts(ind, 0)
j = pts(ind, 1)
ab = AnnotationBbox(imagebox, (i, j), frameon=False)
ax.add_artist(ab)
plt.title(title)
plt.show()
کد زیر مجموعه داده Olivetti faces را واکشی می کند و نمونه هایی را با برچسب های <4 استخراج می کند:
faces = dt.fetch_olivetti_faces()
X_faces = faces.data
y_faces = faces.target
ind = y_faces < 4
X_faces = X_faces(ind,:)
y_faces = y_faces(ind)
و بدون بحث بیشتر، بیایید داده ها را در آن بارگذاری کنیم و ما را اجرا کنیم mapData()
تابع روی آی تی!
استفاده از فاصله های زوجی اقلیدسی
نگاشت مجموعه داده چهره Olivetti با استفاده از فواصل اقلیدسی در زیر نشان داده شده است. فاصله اقلیدسی فاصله پیشفرض برای MDS است زیرا این فاصله چند منظوره و متداول است:
dist_euclid = euclidean_distances(X_faces)
mapData(dist_euclid, X_faces, y_faces, True,
'Metric MDS with Euclidean')
ما میتوانیم یک نگاشت زیبا از تصاویر 64×64 را در یک فضای دو بعدی ببینیم، جایی که کلاس هر تصویر در بیشتر موارد به خوبی از بقیه جدا میشود. ارزش این را دارد که کمی وقت بگذارید و از این واقعیت قدردانی کنید که تصاویر موجود در یک فضای بعد 64×64 را می توان به یک فضای دو بعدی کاهش داد و همچنان ارزش اطلاعاتی خود را حفظ کرد.
استفاده از فواصل زوج منهتن
برای مقایسه، می توانیم MDS را انجام دهیم روی همان داده ها با استفاده از فواصل زوجی منهتن. کد زیر از ماتریس فاصله منهتن به عنوان ورودی استفاده می کند mapData()
:
dist_L1 = manhattan_distances(X_faces)
mapData(dist_L1, X_faces, y_faces, True,
'Metric MDS with Manhattan')
میتوانیم ببینیم که نقشهبرداری کاملاً شبیه به نقشهای است که از طریق فواصل اقلیدسی به دست میآید. هر کلاس به خوبی در فضای با ابعاد پایینتر از هم جدا شدهاند، هر چند که آنها افست هستند کمی متفاوت روی طرح.
انجام مقیاسگذاری چند بعدی غیر متریک
به عنوان مثال آخر، MDS غیر متریک را نشان خواهیم داد روی همان مجموعه داده با استفاده از فواصل اقلیدسی و ببینید که چگونه با نسخه متریک مربوطه مقایسه می شود:
mapData(dist_euclid, X_faces, y_faces, False,
'Non-metric MDS with Euclidean')
در اینجا سکسکه های بسیار زیادی وجود دارد. ما می توانیم ببینیم که این نسخه از MDS نمی کند خیلی خوب اجرا کن روی مجموعه داده چهره های Olivetti.
این عمدتا به دلیل ماهیت کمی داده ها است.
MDS غیر متریک فواصل رتبه بندی شده بین اشیاء را به جای فواصل واقعی حفظ می کند.
این n_components
پارامتر در MDS
یکی از پارامترهای مهمی که در MDS دخیل است، اندازه فضای کمبعدی است که نقاط در آن تعبیه شدهاند.
وقتی از MDS به عنوان یک مرحله پیش پردازش برای کاهش ابعاد استفاده می شود، این بسیار مرتبط است.
این سوال پیش می آید:
فقط چند بعد را انتخاب می کنید تا بدون از دست دادن اطلاعات مهم، ابعاد را تا حد ممکن کاهش دهید؟
یک روش ساده برای انتخاب مقدار این پارامتر، اجرای MDS است روی ارزش های مختلف از n_components
و رسم کنید stress_
ارزش برای هر تعبیه با توجه به اینکه stress_
ارزش با ابعاد بالاتر کاهش مییابد – شما نقطهای را انتخاب میکنید که تعادل منصفانهای بین آن وجود دارد stress_
و n_components
.
کد زیر MDS را با تغییر ابعاد از 1 تا 20 اجرا می کند و مربوطه را رسم می کند stress_
ویژگی برای هر جاسازی:
stress = ()
max_range = 21
for dim in range(1, max_range):
mds = MDS(n_components=dim, dissimilarity='precomputed', random_state=0)
pts = mds.fit_transform(dist_euclid)
stress.append(mds.stress_)
plt.plot(range(1, max_range), stress)
plt.xticks(range(1, max_range, 2))
plt.xlabel('n_components')
plt.ylabel('stress')
plt.show()
ما می توانیم ببینیم که افزایش ارزش n_components
مقدار تنش را در ابتدا کاهش می دهد و سپس سطح منحنی را کاهش می دهد. تقریباً هیچ تفاوتی بین ابعاد 18 و 19 وجود ندارد، اما وجود دارد بزرگ تفاوت بین ابعاد 1 و 2
زانویی منحنی انتخاب خوبی برای مقدار بهینه است n_components
. در این مورد مقدار را می توان در 4 در نظر گرفت که یک است کاهش شگفت انگیز 0.09٪ از ویژگی ها / ویژگی ها.
نتیجه گیری
این راهنما مقدمه ای بود برای مقیاس بندی چند بعدی در پایتون، با استفاده از Scikit-Learn. ما نگاهی به روش عملکرد مقیاسپذیری چند بعدی، فراپارامترهای آن، کدام تغییرات و سپس اعمال آن انداختهایم. روی یک مجموعه داده عملی
ما از مجموعه داده Olivetti Faces از AT&T استفاده کردهایم و نشان دادهایم که تصاویری که در فضایی با ابعاد 64×64 قرار دارند را میتوان به یک دو بعدی فضا، و همچنان الگوها یا خوشه های فردی را در سراسر تصاویر حفظ می کند.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-09 02:13:02