{"id":481585,"date":"2026-05-29T12:06:44","date_gmt":"2026-05-29T12:06:44","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=481585"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=481585","title":{"rendered":"\u0420\u0430\u043d\u0436\u0438\u0440\u0443\u0435\u043c \u0442\u0440\u0435\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e TRIBE \u0438 RBF"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041e\u0449\u0443\u0449\u0435\u043d\u0438\u0435\u00a0\u2014 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0442\u0440\u0435\u043a \u0438\u043b\u0438\u00a0\u043d\u0435\u0442, \u0445\u043e\u0447\u0435\u0442\u0441\u044f\u00a0\u043b\u0438 \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0432\u0443\u043a\u0430 \u043c\u043e\u0437\u0433\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u00ab\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u00bb \u043c\u0443\u0437\u044b\u043a\u0438 \u043f\u043e\u00a0\u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c \u0438\u043b\u0438\u00a0\u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0430\u043c, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0446\u0435\u043d\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0440\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0430\u0443\u0434\u0438\u043e, \u0430\u00a0\u0437\u0430\u0442\u0435\u043c \u0443\u0436\u0435 \u043f\u043e\u00a0\u044d\u0442\u0438\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u0442\u0440\u0435\u043a\u043e\u0432. \u0414\u043b\u044f\u00a0\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c <strong>TRIBE<\/strong>. <\/p>\n<p>TRIBE\u00a0\u2014 \u044d\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c brain encoding: \u043e\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0442\u0438\u043c\u0443\u043b \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u043e\u0442\u043a\u043b\u0438\u043a \u043e\u043d \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0432\u00a0\u043a\u043e\u0440\u0435 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043c\u043e\u0437\u0433\u0430. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e TRIBE \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u00a0\u0432\u0438\u0434\u0435\u043e \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0442\u0440\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432\u00a0\u2014 \u0442\u0435\u043a\u0441\u0442, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0437\u0432\u0443\u043a. \u0412\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0443\u0434\u0438\u043e: \u0430\u0443\u0434\u0438\u043e \u0444\u0430\u0439\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043d\u0430\u00a0\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0440\u044b.<\/p>\n<p>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435. \u041d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u0434\u0430\u0451\u0442\u0441\u044f \u0430\u0443\u0434\u0438\u043e \u0444\u0430\u0439\u043b, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 &#8212; \u043c\u0430\u0442\u0440\u0438\u0446\u0430:<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"X^{\\mathrm{TRIBE}} \\in \\mathbb{R}^{T \\times D},\" alt=\"X^{\\mathrm{TRIBE}} \\in \\mathbb{R}^{T \\times D},\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d5\/d5b\/d5bce9161ee83d6e6c5fc62a86557e77.svg\" width=\"128\" height=\"16\" data-width=\"16.275\" data-height=\"2.593\" data-vertical-align=\"-0.731\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d5\/d5b\/d5bce9161ee83d6e6c5fc62a86557e77.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d5\/d5b\/d5bce9161ee83d6e6c5fc62a86557e77.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0433\u0434\u0435 T\u00a0\u2014 \u0447\u0438\u0441\u043b\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432, \u0430\u00a0D\u00a0\u2014 \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432 \u043a\u043e\u0440\u043a\u043e\u0432\u043e\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438. D \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 20\u00a0\u0442\u044b\u0441\u044f\u0447, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u043a\u043e\u0440\u044b. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043e\u0434\u0438\u043d \u0442\u0440\u0435\u043a \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f  \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0443 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043c\u043e\u0437\u0433\u0430 \u043f\u043e \u043c\u0435\u0440\u0435 \u0437\u0432\u0443\u0447\u0430\u043d\u0438\u044f \u043c\u0443\u0437\u044b\u043a\u0438.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Free Music Archive (\u0434\u0430\u043b\u0435\u0435 FMA): \u044d\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 Music Information Retrieval: \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0436\u0430\u043d\u0440\u043e\u0432, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439, \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0445\u043e\u0436\u0435\u0439 \u043c\u0443\u0437\u044b\u043a\u0438, \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u043b\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f FMA \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 100 \u0442\u044b\u0441\u044f\u0447 \u0442\u0440\u0435\u043a\u043e\u0432, \u043d\u043e \u0432 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442 <code>small<\/code>: 8000 mp3-\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e 30 \u0441\u0435\u043a\u0443\u043d\u0434, 8 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0436\u0430\u043d\u0440\u043e\u0432. \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u0430\u0436\u0435\u043d \u043d\u0435 \u0436\u0430\u043d\u0440, \u0430 \u043f\u043e\u043b\u044f \u0438\u0437 <code>tracks.csv<\/code>: \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0440\u0435\u043a\u0430, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0430\u043b\u044c\u0431\u043e\u043c\u0430 \u0438 \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0439.<\/p>\n<p>\u0418\u0434\u0435\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u0442\u0430\u043a\u0430\u044f: \u0435\u0441\u043b\u0438 TRIBE \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432 \u0441\u0432\u043e\u0438\u0445 \u0432\u044b\u0445\u043e\u0434\u0430\u0445 \u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0437\u0432\u0443\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043e\u0437\u0433\u043e\u043c, \u0442\u043e \u0432 \u044d\u0442\u0438\u0445 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0430\u0431\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 \u0442\u0440\u0435\u043a \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u0447\u0430\u0449\u0435. \u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0442\u0430\u043a: \u0432\u0437\u044f\u0442\u044c \u0434\u0432\u0430 \u0442\u0440\u0435\u043a\u0430 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u0430 \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u0438\u0437\u00a0\u043d\u0438\u0445 \u043d\u0430\u0431\u0440\u0430\u043b \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0439. \u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e\u00a0\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u0430\u00a0\u2014 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u043b\u043e\u0445\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0430\u0440\u0442\u0438\u0441\u0442\u0430\u043c\u0438 \u0438 \u0440\u0435\u043b\u0438\u0437\u0430\u043c\u0438: \u0443\u00a0\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f 10\u00a0\u0442\u044b\u0441\u044f\u0447 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0439 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0432\u0430\u043b\u043e\u043c, \u0443\u00a0\u0434\u0440\u0443\u0433\u043e\u0433\u043e\u00a0\u2014 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u0438. <\/p>\n<p>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0442\u0430\u043a\u043e\u0439:<\/p>\n<ol>\n<li>\n<p>\u0432\u0437\u044f\u0442\u044c \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e FMA small (\u043d\u0435 \u0432\u0435\u0441\u044c \u0434\u0430\u0442\u0430\u0441\u0435\u0442, \u0442\u0430\u043a \u043a\u0430\u043a TRIBE \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430 \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c);<\/p>\n<\/li>\n<li>\n<p>\u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u043a\u0438 \u043f\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u0430\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0440\u0435\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0439 \u0438\u0437 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u0430\u0443\u0434\u0438\u043e \u0447\u0435\u0440\u0435\u0437 TRIBE \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0436\u0430\u0442\u044c \u0432\u044b\u0445\u043e\u0434 TRIBE \u0447\u0435\u0440\u0435\u0437 <code>StandardScaler -&gt; PCA -&gt; StandardScaler<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0430\u0440\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e RBF-\u0441\u0435\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0434\u0430\u0451\u0442 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \u0442\u0440\u0435\u043a\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c accuracy \u043d\u0430 \u043f\u0430\u0440\u0430\u0445: \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0440\u0435\u043a \u0432\u044b\u0448\u0435.<\/p>\n<\/li>\n<\/ol>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u043e\u043a\u043e\u043b\u043e 85% pairwise accuracy \u043d\u0430\u00a0train \u0438 \u043e\u043a\u043e\u043b\u043e 58% \u043d\u0430\u00a0test. \u042d\u0442\u043e \u0441\u043b\u0430\u0431\u044b\u0439, \u043d\u043e\u00a0\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b. \u041d\u0438\u0436\u0435\u00a0\u2014 \u043a\u0430\u043a\u00a0\u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d \u0431\u044b\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d.<\/p>\n<h3>\u0427\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f<\/h3>\n<p>\u041d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0435\u0441\u0442\u044c \u0442\u0440\u0435\u043a. \u041f\u043e\u0441\u043b\u0435 TRIBE \u043e\u043d \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f  \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 <img decoding=\"async\" class=\"formula inline\" source=\"X^{\\mathrm{TRIBE}}.\" alt=\"X^{\\mathrm{TRIBE}}.\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/fa\/fab\/fab4fd2d06b519db0a70f311b0ee0a56.svg\" width=\"56\" height=\"16\" data-width=\"7.992\" data-height=\"2.593\" data-vertical-align=\"-0.731\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/fa\/fab\/fab4fd2d06b519db0a70f311b0ee0a56.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/fa\/fab\/fab4fd2d06b519db0a70f311b0ee0a56.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u041e\u0431\u0443\u0447\u0430\u0435\u043c\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u043a\u0430\u043b\u044f\u0440 f(X) \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0440\u0435\u043a\u0430. \u0414\u043b\u044f \u043f\u0430\u0440\u044b \u0442\u0440\u0435\u043a\u043e\u0432 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f:<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"f(X_{\\mathrm{popular}}) &gt; f(X_{\\mathrm{less\\ popular}})\" alt=\"f(X_{\\mathrm{popular}}) &gt; f(X_{\\mathrm{less\\ popular}})\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/cc\/cc8\/cc8ead981dbe4352b22b3ac076eb5a33.svg\" width=\"208\" height=\"16\" data-width=\"26.644\" data-height=\"2.347\" data-vertical-align=\"-0.608\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/cc\/cc8\/cc8ead981dbe4352b22b3ac076eb5a33.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/cc\/cc8\/cc8ead981dbe4352b22b3ac076eb5a33.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e\u0435 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435. \u041e\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u0435\u0435 \u043a \u0440\u0430\u0437\u043d\u044b\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u0430\u043b\u044c\u0431\u043e\u043c\u0430\u043c\u0438, \u0436\u0430\u043d\u0440\u0430\u043c\u0438 \u0438 \u0430\u0440\u0442\u0438\u0441\u0442\u0430\u043c\u0438. <\/p>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 FMA<\/h3>\n<p>\u0412 FMA \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 <code>tracks.csv<\/code> \u0441 \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c. \u0414\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043d\u0443\u0436\u043d\u044b \u0442\u0440\u0438 \u043f\u043e\u043b\u044f:<\/p>\n<ul>\n<li>\n<p><code>track_id<\/code> &#8212; \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 mp3-\u0444\u0430\u0439\u043b;<\/p>\n<\/li>\n<li>\n<p><code>album_id<\/code> &#8212; \u0447\u0442\u043e\u0431\u044b \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><code>track\/listens<\/code> &#8212; \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0435 \u043a\u0430\u043a \u0440\u0435\u0439\u0442\u0438\u043d\u0433.<\/p>\n<\/li>\n<\/ul>\n<p>\u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"python\">from pathlib import Pathimport pandas as pdMETA_DIR = Path(\"data\/fma_metadata\")TRACKS_CSV = META_DIR \/ \"tracks.csv\"tracks = pd.read_csv(      TRACKS_CSV,    index_col=0,     header=[0, 1],     engine=\"python\",      on_bad_lines=\"skip\",)tracks = tracks[tracks[(\"set\", \"subset\")] == \"small\"].copy()tracks[\"track_id\"] = tracks.index.astype(int)tracks[\"album_id\"] = tracks[(\"album\", \"id\")]tracks[\"popularity\"] = tracks[(\"track\", \"listens\")]tracks = tracks[[\"track_id\", \"album_id\", \"popularity\"]].dropna()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410\u043b\u044c\u0431\u043e\u043c\u044b \u0441 1-2 \u0442\u0440\u0435\u043a\u0430\u043c\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b: \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0438\u0445  \u043d\u0435\u0447\u0435\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u044b, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0443\u043c 3 \u0442\u0440\u0435\u043a\u0430:<\/p>\n<pre><code class=\"python\">MIN_TRACKS_IN_ALBUM = 3album_sizes = tracks.groupby(\"album_id\").size()valid_album_ids = album_sizes[album_sizes &gt;= MIN_TRACKS_IN_ALBUM].indextracks = tracks[tracks[\"album_id\"].isin(valid_album_ids)].copy()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 train\/test \u0442\u043e\u0436\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u0430\u043c.<\/p>\n<pre><code class=\"python\">import randomSEED = 42TEST_FRAC = 0.2rng = random.Random(SEED)album_ids = list(tracks[\"album_id\"].unique())rng.shuffle(album_ids)n_test = int(len(album_ids) * TEST_FRAC)test_albums = set(album_ids[:n_test])train_albums = set(album_ids[n_test:])tracks[\"split\"] = tracks[\"album_id\"].apply(    lambda album_id: \"test\" if album_id in test_albums else \"train\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0424\u0430\u0439\u043b\u044b \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code>data\/fma_dataset\/  train\/            album_123\/             000001.mp3                000002.mp3               ratings.json     test\/           album_456\/           000101.mp3               000102.mp3               ratings.json<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>ratings.json<\/code> \u0445\u0440\u0430\u043d\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043f\u043a\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u0430:<\/p>\n<pre><code class=\"json\">{      \"000001\": 1534,     \"000002\": 847,      \"000003\": 2681}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u0430\u0440 \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0430\u043b\u044c\u0431\u043e\u043c\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c: \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0430\u0442\u0440\u0438\u0446 \u0442\u0440\u0435\u043a\u043e\u0432 \u043f\u043b\u044e\u0441 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u0440 <code>(better_idx, worse_idx)<\/code>.<\/p>\n<h3>\u041f\u0440\u043e\u0433\u043e\u043d \u0430\u0443\u0434\u0438\u043e \u0447\u0435\u0440\u0435\u0437 TRIBE<\/h3>\n<p>TRIBE \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u044d\u043a\u0441\u0442\u0440\u0430\u043a\u0442\u043e\u0440 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432.  \u041a\u043e\u0434 \u043d\u0438\u0436\u0435  \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441 \u0431\u0435\u0437 \u0434\u0435\u0442\u0430\u043b\u0435\u0439.<\/p>\n<pre><code class=\"python\">from pathlib import Pathimport numpy as npfrom tribev2.demo_utils import TribeModelDATASET_PATH = Path(\"data\/fma_dataset\")CACHE_DIR = Path(\"cache\/tribe\")model = TribeModel.from_pretrained(             \"facebook\/tribev2\",              cache_folder=str(CACHE_DIR))for audio_path in sorted(DATASET_PATH.rglob(\"*.mp3\")):   events = model.get_events_dataframe(audio_path=str(audio_path))    events = events[events[\"type\"] == \"Audio\"]     preds, segments = model.predict(events=events)     preds = np.asarray(preds, dtype=np.float32)     np.save(audio_path.with_suffix(\".npy\"), preds)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0440\u044f\u0434\u043e\u043c \u0441 \u043a\u0430\u0436\u0434\u044b\u043c <code>mp3<\/code> \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>npy<\/code>:<\/p>\n<pre><code>000001.mp3000001.npyratings.json<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>T \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0435\u043a\u0430 \u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a TRIBE \u0440\u0435\u0436\u0435\u0442 \u0430\u0443\u0434\u0438\u043e \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. D \u0432\u0435\u043b\u0438\u043a\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u043e\u0431\u0443\u0447\u0430\u0442\u044c \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0432\u044b\u0445\u043e\u0434\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0437-\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438.<\/p>\n<h3>\u0421\u0436\u0430\u0442\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 TRIBE<\/h3>\n<p>\u0421\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u0437\u043e\u043d\u044b \u043c\u043e\u0437\u0433\u0430 \u0432 \u0442\u0430\u043a\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434 RBF-\u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u0436\u0430\u0442\u0438\u0435:<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{StandardScaler}_1 \\rightarrow \\mathrm{PCA} \\rightarrow \\mathrm{StandardScaler}_2\" alt=\"\\mathrm{StandardScaler}_1 \\rightarrow \\mathrm{PCA} \\rightarrow \\mathrm{StandardScaler}_2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/a6\/a6d\/a6d2837e696a6d96afc2859b85bdf3c7.svg\" width=\"344\" height=\"16\" data-width=\"43.835\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/a6\/a6d\/a6d2837e696a6d96afc2859b85bdf3c7.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/a6\/a6d\/a6d2837e696a6d96afc2859b85bdf3c7.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>PCA \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 16 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 (explained variance ~ 95%): <\/p>\n<pre><code class=\"python\">from pathlib import Pathimport joblibimport numpy as npfrom sklearn.pipeline import Pipelinefrom sklearn.decomposition import PCAfrom sklearn.preprocessing import StandardScalerDATASET_PATH = Path(\"data\/fma_dataset\")PREPROCESSOR_PATH = Path(\"models\/preprocessor.pkl\")N_COMPONENTS = 16npy_files = sorted((DATASET_PATH \/ \"train\").rglob(\"*.npy\"))blocks = []for path in npy_files:      x = np.load(path)      blocks.append(x.astype(np.float32))X_train_frames = np.concatenate(blocks, axis=0)preprocessor = Pipeline([                             (\"scaler_1\", StandardScaler()),      (\"pca\", PCA( n_components=N_COMPONENTS, svd_solver=\"randomized\", random_state=42, )),      (\"scaler_2\", StandardScaler()),])X_debug = preprocessor.fit_transform(X_train_frames)pca = preprocessor.named_steps[\"pca\"]PREPROCESSOR_PATH.parent.mkdir(parents=True, exist_ok=True)joblib.dump(preprocessor, PREPROCESSOR_PATH)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0440\u0435\u043a \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439:<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"X \\in \\mathbb{R}^{T \\times 16}\" alt=\"X \\in \\mathbb{R}^{T \\times 16}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/5f\/5f4\/5f42714ed6a5cfb066ddbddd8feb917a.svg\" width=\"80\" height=\"16\" data-width=\"10.486\" data-height=\"2.583\" data-vertical-align=\"-0.726\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/5f\/5f4\/5f42714ed6a5cfb066ddbddd8feb917a.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/5f\/5f4\/5f42714ed6a5cfb066ddbddd8feb917a.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<h3>\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0440 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0427\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0435\u043b\u0438\u0437\u0430, \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u0438, \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f \u0432 \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0438, \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0430\u0440\u0442\u0438\u0441\u0442\u0430, \u043e\u0431\u043b\u043e\u0436\u043a\u0438 \u0438 \u0435\u0449\u0451 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u043e\u0431\u0443\u0447\u0430\u0442\u044c \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044e <code>audio -&gt; listens<\/code>, \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0430\u0443\u0434\u0438\u043e\u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c \u0442\u043e, \u0447\u0435\u0433\u043e \u0432 \u0430\u0443\u0434\u0438\u043e \u043d\u0435\u0442.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c pairwise ranking. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u043f\u0430\u0440\u044b \u0442\u0440\u0435\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0442\u0440\u0435\u043a \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0439, \u043e\u043d \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f <code>better<\/code>, \u0432\u0442\u043e\u0440\u043e\u0439 &#8212; <code>worse<\/code>. \u041d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u0436\u0435 \u043f\u043b\u043e\u0445\u043e: \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 1000 \u0438 1020 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0448\u0443\u043c\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c, \u0430 \u043f\u0430\u0440\u044b \u0441 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p>\u0414\u043b\u044f \u0430\u043b\u044c\u0431\u043e\u043c\u0430 \u0441 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u0430\u043c\u0438 r_i:<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"s_i = \\log_{10}(r_i + \\varepsilon)\" alt=\"s_i = \\log_{10}(r_i + \\varepsilon)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/84\/84c\/84cef61a586f5f3b94e443795d7d2636.svg\" width=\"128\" height=\"16\" data-width=\"16.837\" data-height=\"2.278\" data-vertical-align=\"-0.573\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/84\/84c\/84cef61a586f5f3b94e443795d7d2636.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/84\/84c\/84cef61a586f5f3b94e443795d7d2636.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u041f\u0430\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438:<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"|s_i - s_j| \\geq \\sigma_{\\mathrm{album}},\" alt=\"|s_i - s_j| \\geq \\sigma_{\\mathrm{album}},\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/ca\/caa\/caaeb42075b5b3a9d4d9cfbf74dcbd33.svg\" width=\"136\" height=\"16\" data-width=\"17.214\" data-height=\"2.363\" data-vertical-align=\"-0.616\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/ca\/caa\/caaeb42075b5b3a9d4d9cfbf74dcbd33.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/ca\/caa\/caaeb42075b5b3a9d4d9cfbf74dcbd33.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0433\u0434\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"\\sigma_{\\mathrm{album}}\" alt=\"\\sigma_{\\mathrm{album}}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/fb\/fbf\/fbf6d648a6122780dc7b72da8d0638a6.svg\" width=\"40\" height=\"16\" data-width=\"5.836\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/fb\/fbf\/fbf6d648a6122780dc7b72da8d0638a6.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/fb\/fbf\/fbf6d648a6122780dc7b72da8d0638a6.svg 781w\" loading=\"lazy\" decode=\"async\"\/> &#8212; \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u0430.<\/p>\n<p>\u041a\u043e\u0434 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u0430\u0440:<\/p>\n<pre><code class=\"python\">from itertools import combinationsimport numpy as npMIN_SIGMA_TO_COMPARE = 1.0EPS = 1e-8def build_album_pairs(ratings):      scores = np.asarray(ratings, dtype=np.float32)      log_scores = np.log10(scores + EPS)      sigma = np.std(log_scores)      threshold = MIN_SIGMA_TO_COMPARE * sigma      pairs = []      for i, j in combinations(range(len(log_scores)), 2):            diff = abs(log_scores[i] - log_scores[j])            if diff &lt; threshold:                  continue            if log_scores[i] &gt; log_scores[j]:      pairs.append((i, j))            else:                  pairs.append((j, i))      return pairs<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c <code>(i, j)<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442: \u0442\u0440\u0435\u043a <code>i<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0446\u0435\u043d\u043a\u0443 \u0432\u044b\u0448\u0435, \u0447\u0435\u043c \u0442\u0440\u0435\u043a <code>j<\/code>.<\/p>\n<h3>\u0421\u0431\u043e\u0440\u043a\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0430\u043b\u044c\u0431\u043e\u043c\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:<\/p>\n<pre><code class=\"python\">dataset = [               {                    \"tracks\": [track_matrix_0, track_matrix_1, ...],                   \"pairs\": [(better_idx, worse_idx), ...],               },              ...,]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u0434:<\/p>\n<pre><code class=\"python\">from pathlib import Pathimport jsonimport joblibimport numpy as npDATASET_PATH = Path(\"data\/fma_dataset\")PREPROCESSOR_PATH = Path(\"models\/preprocessor.pkl\")preprocessor = joblib.load(PREPROCESSOR_PATH)def load_split(split_name):      split_dir = DATASET_PATH \/ split_name      albums = []      for album_dir in sorted(p for p in split_dir.iterdir() if p.is_dir()):    with open(album_dir \/ \"ratings.json\", \"r\", encoding=\"utf-8\") as f:      ratings_dict = json.load(f)      tracks = []      ratings = []      for npy_path in sorted(album_dir.glob(\"*.npy\")):        track_name = npy_path.stem        if track_name not in ratings_dict:          continue                   x = np.load(npy_path)         x = preprocessor.transform(x).astype(np.float32)                tracks.append(x)        ratings.append(float(ratings_dict[track_name]))               if len(tracks) &lt; 2:        continue                   pairs = build_album_pairs(ratings)             if not pairs:         continue             albums.append({                      \"tracks\": tracks,                       \"pairs\": pairs,              })    return albumstrain_dataset = load_split(\"train\")test_dataset = load_split(\"test\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: <code>pairs<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u0430. \u042d\u0442\u043e \u043d\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0444\u0430\u0439\u043b\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 \u043f\u0430\u0440\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043a\u0430\u043a <code>(album_idx, better_idx, worse_idx)<\/code>:<\/p>\n<pre><code class=\"python\">def flatten_pairs(dataset):      result = []      for album_idx, album in enumerate(dataset):            for better_idx, worse_idx in album[\"pairs\"]:                  result.append((album_idx, better_idx, worse_idx))      return resulttrain_pairs = flatten_pairs(train_dataset)test_pairs = flatten_pairs(test_dataset)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041c\u043e\u0434\u0435\u043b\u044c: RBF \u043f\u043e\u0432\u0435\u0440\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0442\u0440\u0435\u043a\u00a0\u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432:<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"\\mathbf{b}_j \\in \\mathbb{R}^{16}, \\qquad j = 1, \\ldots, N_{\\mathrm{bases}}\" alt=\"\\mathbf{b}_j \\in \\mathbb{R}^{16}, \\qquad j = 1, \\ldots, N_{\\mathrm{bases}}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d6\/d62\/d621cd9ad5b90d3fe510d047eb3fa54b.svg\" width=\"232\" height=\"16\" data-width=\"29.797\" data-height=\"2.666\" data-vertical-align=\"-0.767\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d6\/d62\/d621cd9ad5b90d3fe510d047eb3fa54b.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d6\/d62\/d621cd9ad5b90d3fe510d047eb3fa54b.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c RBF-\u0441\u0435\u0442\u044c. RBF-\u0441\u0435\u0442\u044c (Radial Basis Function network) &#8212; \u044d\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043d\u0430\u0431\u043e\u0440\u043e\u043c &#171;\u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0445&#187; \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 RBF-\u0443\u0437\u0435\u043b \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432: \u0435\u0441\u043b\u0438 \u0432\u0445\u043e\u0434 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043e\u0442\u043a\u043b\u0438\u043a \u0443\u0437\u043b\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0439; \u0435\u0441\u043b\u0438 \u0434\u0430\u043b\u0451\u043a\u00a0\u2014 \u043e\u0442\u043a\u043b\u0438\u043a \u0431 \u044b\u0441\u0442\u0440\u043e \u043f\u0430\u0434\u0430\u0435\u0442.<br \/> \u0412 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0435 RBF-\u043c\u043e\u0434\u0435\u043b\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <img decoding=\"async\" class=\"formula inline\" source=\"N_{\\mathrm{bases}}\" alt=\"N_{\\mathrm{bases}}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/a7\/a7b\/a7b711fdeb5572ab5b84d03d81f2b2d9.svg\" width=\"40\" height=\"16\" data-width=\"5.665\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/a7\/a7b\/a7b711fdeb5572ab5b84d03d81f2b2d9.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/a7\/a7b\/a7b711fdeb5572ab5b84d03d81f2b2d9.svg 781w\" loading=\"lazy\" decode=\"async\"\/> = 8 \u0446\u0435\u043d\u0442\u0440\u043e\u0432:<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"\\mathbf{b}_j \\in \\mathbb{R}^{16}, \\qquad j = 1, \\ldots, N_{\\mathrm{bases}}\" alt=\"\\mathbf{b}_j \\in \\mathbb{R}^{16}, \\qquad j = 1, \\ldots, N_{\\mathrm{bases}}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d6\/d62\/d621cd9ad5b90d3fe510d047eb3fa54b.svg\" width=\"232\" height=\"16\" data-width=\"29.797\" data-height=\"2.666\" data-vertical-align=\"-0.767\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d6\/d62\/d621cd9ad5b90d3fe510d047eb3fa54b.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d6\/d62\/d621cd9ad5b90d3fe510d047eb3fa54b.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"\\mathbf{x}_t \" alt=\"\\mathbf{x}_t \" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ed\/ed9\/ed95ed021200220dc8b68d03fa2fef51.svg\" width=\"16\" height=\"16\" data-width=\"2.139\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ed\/ed9\/ed95ed021200220dc8b68d03fa2fef51.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/ed\/ed9\/ed95ed021200220dc8b68d03fa2fef51.svg 781w\" loading=\"lazy\" decode=\"async\"\/>\u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430. <\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"d_{tj}^{2} = \\sum_{k=1}^{16} w_k (x_{tk} - b_{jk})^2\" alt=\"d_{tj}^{2} = \\sum_{k=1}^{16} w_k (x_{tk} - b_{jk})^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/31\/312\/312304c6dd2d498fe353f2fadc53b6fd.svg\" width=\"176\" height=\"48\" data-width=\"22.961\" data-height=\"6.757\" data-vertical-align=\"-2.813\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/31\/312\/312304c6dd2d498fe353f2fadc53b6fd.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/31\/312\/312304c6dd2d498fe353f2fadc53b6fd.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"w_k &gt; 0 \" alt=\"w_k &gt; 0 \" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/27\/278\/278789a41f3dcc48ebeb85b088335535.svg\" width=\"48\" height=\"12\" data-width=\"6.789\" data-height=\"1.864\" data-vertical-align=\"-0.357\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/27\/278\/278789a41f3dcc48ebeb85b088335535.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/27\/278\/278789a41f3dcc48ebeb85b088335535.svg 781w\" loading=\"lazy\" decode=\"async\"\/>&#8212; \u043e\u0431\u0443\u0447\u0430\u0435\u043c\u0430\u044f \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c <img decoding=\"async\" class=\"formula inline\" source=\"k\" alt=\"k\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/8c\/8ce\/8ce4b16b22b58894aa86c421e8759df3.svg\" width=\"12\" height=\"12\" data-width=\"1.179\" data-height=\"1.595\" data-vertical-align=\"-0.025\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/8c\/8ce\/8ce4b16b22b58894aa86c421e8759df3.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/8c\/8ce\/8ce4b16b22b58894aa86c421e8759df3.svg 781w\" loading=\"lazy\" decode=\"async\"\/>-\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b. \u0427\u0442\u043e\u0431\u044b \u0432\u0435\u0441 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u0432 \u043a\u043e\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0441\u044b\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <img decoding=\"async\" class=\"formula inline\" source=\"w_raw\" alt=\"w_raw\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f9\/f91\/f914cfd7005bcd48831f2e1a60075a95.svg\" width=\"40\" height=\"12\" data-width=\"5.346\" data-height=\"1.359\" data-vertical-align=\"-0.357\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f9\/f91\/f914cfd7005bcd48831f2e1a60075a95.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f9\/f91\/f914cfd7005bcd48831f2e1a60075a95.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u0441 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>softplus<\/code>:<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"w_k = \\operatorname{softplus}(w_{\\mathrm{raw}, k})\" alt=\"w_k = \\operatorname{softplus}(w_{\\mathrm{raw}, k})\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/62\/62f\/62f9c234d40f67515e208da6298fd2cc.svg\" width=\"160\" height=\"16\" data-width=\"20.718\" data-height=\"2.347\" data-vertical-align=\"-0.608\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/62\/62f\/62f9c234d40f67515e208da6298fd2cc.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/62\/62f\/62f9c234d40f67515e208da6298fd2cc.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u041e\u0442\u043a\u043b\u0438\u043a:<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"K_{tj} = \\exp(-\\gamma_j d_{tj}^{2})\" alt=\"K_{tj} = \\exp(-\\gamma_j d_{tj}^{2})\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c3\/c3f\/c3fa0add8a8fe7ccac535139c57143ff.svg\" width=\"136\" height=\"16\" data-width=\"17.959\" data-height=\"2.885\" data-vertical-align=\"-0.877\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c3\/c3f\/c3fa0add8a8fe7ccac535139c57143ff.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c3\/c3f\/c3fa0add8a8fe7ccac535139c57143ff.svg 781w\" loading=\"lazy\" decode=\"async\"\/>,<\/p>\n<p>\u0433\u0434\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"\\gamma_j &gt; 0\" alt=\"\\gamma_j &gt; 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c0\/c0a\/c0a1db6dcf1637f3f217510f5effcf9f.svg\" width=\"48\" height=\"16\" data-width=\"6.167\" data-height=\"2.363\" data-vertical-align=\"-0.616\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c0\/c0a\/c0a1db6dcf1637f3f217510f5effcf9f.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c0\/c0a\/c0a1db6dcf1637f3f217510f5effcf9f.svg 781w\" loading=\"lazy\" decode=\"async\"\/> &#8212; \u043e\u0431\u0443\u0447\u0430\u0435\u043c\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"j\" alt=\"j\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/36\/363\/363b122c528f54df4a0446b6bab05515.svg\" width=\"12\" height=\"12\" data-width=\"0.932\" data-height=\"1.957\" data-vertical-align=\"-0.462\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/36\/363\/363b122c528f54df4a0446b6bab05515.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/36\/363\/363b122c528f54df4a0446b6bab05515.svg 781w\" loading=\"lazy\" decode=\"async\"\/>-\u0433\u043e \u0431\u0430\u0437\u0438\u0441\u0430. \u0411\u043e\u043b\u044c\u0448\u043e\u0439 <img decoding=\"async\" class=\"formula inline\" source=\"\\gamma_j\" alt=\"\\gamma_j\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/47\/47c\/47c40de22783a1b81e0787f59324f72b.svg\" width=\"16\" height=\"16\" data-width=\"2.019\" data-height=\"2.363\" data-vertical-align=\"-0.616\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/47\/47c\/47c40de22783a1b81e0787f59324f72b.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/47\/47c\/47c40de22783a1b81e0787f59324f72b.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0434\u0435\u043b\u0430\u0435\u0442 \u0431\u0430\u0437\u0438\u0441 \u0443\u0437\u043a\u0438\u043c: \u043e\u043d \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u043a \u0446\u0435\u043d\u0442\u0440\u0443 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b. <\/p>\n<p>\u0421\u043a\u0430\u043b\u044f\u0440\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u043a\u0430\u0434\u0440\u0430:<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"z_t = \\sum_{j=1}^{N_{\\mathrm{bases}}} v_j K_{tj}\" alt=\"z_t = \\sum_{j=1}^{N_{\\mathrm{bases}}} v_j K_{tj}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/31\/312\/31292239cf7f6cf48017ad5104a6e4f9.svg\" width=\"112\" height=\"48\" data-width=\"14.507\" data-height=\"6.986\" data-vertical-align=\"-2.927\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/31\/312\/31292239cf7f6cf48017ad5104a6e4f9.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/31\/312\/31292239cf7f6cf48017ad5104a6e4f9.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0421\u043a\u0430\u043b\u044f\u0440\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u0442\u0440\u0435\u043a\u0430 &#8212; \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438:<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"f(X) = \\frac{1}{T} \\sum_{t=1}^{T} z_t\" alt=\"f(X) = \\frac{1}{T} \\sum_{t=1}^{T} z_t\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/49\/494\/494a26f91fcb504dcd6d2bb0a0054efa.svg\" width=\"128\" height=\"48\" data-width=\"16.376\" data-height=\"6.73\" data-vertical-align=\"-2.799\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/49\/494\/494a26f91fcb504dcd6d2bb0a0054efa.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/49\/494\/494a26f91fcb504dcd6d2bb0a0054efa.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u041f\u043e\u043b\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430 PyTorch:<\/p>\n<pre><code class=\"python\">import torchimport torch.nn as nndef inv_softplus(x):      x = torch.as_tensor(x, dtype=torch.float32)      return torch.log(torch.expm1(x))class RBFSequenceModel(nn.Module):      def __init__(self, n_bases, dim, gamma_init=0.01, w_init=1.0):  super().__init__()         self.n_bases = n_bases      self.dim = dim        self.b = nn.Parameter(torch.randn(n_bases, dim))      self.gamma_raw = nn.Parameter(inv_softplus(gamma_init).repeat(n_bases))      self.v = nn.Parameter(torch.randn(n_bases) * 0.01)         self.w_raw = nn.Parameter(inv_softplus(w_init).repeat(dim))       self.softplus = nn.Softplus()       def w(self):          return self.softplus(self.w_raw)      def gamma(self):           return self.softplus(self.gamma_raw)     def forward(self, x):          diff = x[:, None, :] - self.b[None, :, :]        dist2 = (diff ** 2 * self.w()[None, None, :]).sum(dim=2)        k = torch.exp(-self.gamma()[None, :] * dist2)        z = (k * self.v[None, :]).sum(dim=1)          return z.mean()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041b\u043e\u0441\u0441: softplus \u043e\u0442 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e margin<\/h3>\n<p>\u0414\u043b\u044f \u043f\u0430\u0440\u044b <code>(better, worse)<\/code> \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0447\u0438\u0442\u0430\u0435\u0442:<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"y_{\\mathrm{better}} = f(X_{\\mathrm{better}}), \\qquad y_{\\mathrm{worse}} = f(X_{\\mathrm{worse}})\" alt=\"y_{\\mathrm{better}} = f(X_{\\mathrm{better}}), \\qquad y_{\\mathrm{worse}} = f(X_{\\mathrm{worse}})\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/79\/799\/799384238b2c803f507842706f90081c.svg\" width=\"320\" height=\"16\" data-width=\"40.498\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/79\/799\/799384238b2c803f507842706f90081c.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/79\/799\/799384238b2c803f507842706f90081c.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>Margin:<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"m = y_{\\mathrm{better}} - y_{\\mathrm{worse}}\" alt=\"m = y_{\\mathrm{better}} - y_{\\mathrm{worse}}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/be\/bea\/beaf6f807bc2c6b93c03a719afd216d1.svg\" width=\"144\" height=\"16\" data-width=\"18.467\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/be\/bea\/beaf6f807bc2c6b93c03a719afd216d1.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/be\/bea\/beaf6f807bc2c6b93c03a719afd216d1.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0415\u0441\u043b\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"m &gt; 0\" alt=\"m &gt; 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/12\/128\/1282dbcdc9771c92690c92b70668b383.svg\" width=\"48\" height=\"12\" data-width=\"6.135\" data-height=\"1.597\" data-vertical-align=\"-0.09\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/12\/128\/1282dbcdc9771c92690c92b70668b383.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/12\/128\/1282dbcdc9771c92690c92b70668b383.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439. \u0415\u0441\u043b\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"m &lt; 0\" alt=\"m &lt; 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/2d\/2d6\/2d6febfec6934f12a161aaa9211fa5a1.svg\" width=\"48\" height=\"12\" data-width=\"6.135\" data-height=\"1.597\" data-vertical-align=\"-0.09\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/2d\/2d6\/2d6febfec6934f12a161aaa9211fa5a1.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/2d\/2d6\/2d6febfec6934f12a161aaa9211fa5a1.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0448\u0438\u0431\u043b\u0430\u0441\u044c. \u041b\u043e\u0441\u0441:<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"\\mathcal{L} = \\log(1 + \\exp(-m))\" alt=\"\\mathcal{L} = \\log(1 + \\exp(-m))\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/2b\/2b1\/2b1629403c6b0cfb0c197b0654896e9a.svg\" width=\"176\" height=\"16\" data-width=\"22.09\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/2b\/2b1\/2b1629403c6b0cfb0c197b0654896e9a.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/2b\/2b1\/2b1629403c6b0cfb0c197b0654896e9a.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0412 PyTorch \u044d\u0442\u043e <code>F.softplus(-margin)<\/code>:<\/p>\n<pre><code class=\"python\">import torch.nn.functional as Fdef pairwise_batch_loss(model, dataset, batch):     losses = []       for album_idx, better_idx, worse_idx in batch:         album = dataset[album_idx]            x_better = album[\"tracks\"][better_idx]       x_worse = album[\"tracks\"][worse_idx]          y_better = model(x_better)           y_worse = model(x_worse)          margin = y_better - y_worse          losses.append(F.softplus(-margin))    return torch.stack(losses).mean()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041c\u0435\u0442\u0440\u0438\u043a\u0430<\/h3>\n<p>\u041c\u0435\u0442\u0440\u0438\u043a\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438: \u0434\u043e\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u0440.<\/p>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"\\operatorname{accuracy} = \\frac{\\#\\{(i, j): f(X_i) &gt; f(X_j)\\}} {\\#\\{(i, j)\\}}\" alt=\"\\operatorname{accuracy} = \\frac{\\#\\{(i, j): f(X_i) &gt; f(X_j)\\}} {\\#\\{(i, j)\\}}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/41\/412\/4120f1d215fa72364ca6c8f8af225dbb.svg\" width=\"296\" height=\"40\" data-width=\"37.499\" data-height=\"5.575\" data-vertical-align=\"-2.222\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/41\/412\/4120f1d215fa72364ca6c8f8af225dbb.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/41\/412\/4120f1d215fa72364ca6c8f8af225dbb.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<pre><code class=\"python\">import randomimport torch@torch.no_grad()def evaluate_accuracy(model, dataset, pairs, max_pairs=None):   model.eval()     if max_pairs is not None and len(pairs) &gt; max_pairs:          eval_pairs = random.sample(pairs, max_pairs)     else:            eval_pairs = pairs     correct = 0     for album_idx, better_idx, worse_idx in eval_pairs:        album = dataset[album_idx]         y_better = model(album[\"tracks\"][better_idx])          y_worse = model(album[\"tracks\"][worse_idx])            correct += int(y_better.item() &gt; y_worse.item())       return correct \/ len(eval_pairs)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423 \u044d\u0442\u043e\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u0430\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0430\u044f \u0431\u0430\u0437\u0430: 50%. \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u044b\u0443\u0447\u0438\u043b\u0430, \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u043f\u0430\u0440\u044b.<\/p>\n<h3>\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430:<\/p>\n<pre><code class=\"python\">N_BASES = 8N_EPOCHS = 250BATCH_SIZE = 16LR = 5e-3<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">import randomimport numpy as npimport torchdef batchify(items, batch_size, shuffle=True):      indices = list(range(len(items)))     if shuffle:            random.shuffle(indices)     for start in range(0, len(indices), batch_size):        batch_indices = indices[start:start + batch_size]          yield [items[i] for i in batch_indices]    def convert_dataset_to_torch(dataset, device):    converted = []      for album in dataset:      tracks = [                  torch.tensor(x, dtype=torch.float32, device=device)          for x in album[\"tracks\"]            ]           converted.append({                       \"tracks\": tracks,                        \"pairs\": album[\"pairs\"],    })     return convertedrandom.seed(SEED)np.random.seed(SEED)torch.manual_seed(SEED)DEVICE = \"cuda\" if torch.cuda.is_available() else \"cpu\"train_dataset_torch = convert_dataset_to_torch(train_dataset, DEVICE)test_dataset_torch = convert_dataset_to_torch(test_dataset, DEVICE)train_pairs = flatten_pairs(train_dataset_torch)test_pairs = flatten_pairs(test_dataset_torch)DIM = train_dataset_torch[0][\"tracks\"][0].shape[1]model = RBFSequenceModel(n_bases=N_BASES, dim=DIM).to(DEVICE)optimizer = torch.optim.AdamW(    model.parameters(),    lr=LR)train_losses = []train_accs = []test_accs = []for epoch in range(1, N_EPOCHS + 1):     model.train()     epoch_losses = []    for batch in batchify(train_pairs, BATCH_SIZE, shuffle=True):        optimizer.zero_grad()           loss = pairwise_batch_loss(model, train_dataset_torch, batch)       loss.backward()             optimizer.step()            epoch_losses.append(loss.item())        train_loss = float(np.mean(epoch_losses))     train_acc = evaluate_accuracy(model, train_dataset_torch, train_pairs)    test_acc = evaluate_accuracy(model, test_dataset_torch, test_pairs)      train_losses.append(train_loss)     train_accs.append(train_acc)      test_accs.append(test_acc)        print(        f\"epoch={epoch:03d} \"                 f\"loss={train_loss:.6f} \"                f\"train_acc={train_acc * 100:.2f}% \"                f\"test_acc={test_acc * 100:.2f}%\"        )<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/h3>\n<p>\u041d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043b\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code>train accuracy: \u043e\u043a\u043e\u043b\u043e 85%test accuracy:  \u043e\u043a\u043e\u043b\u043e 58%<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6c2\/06e\/a3c\/6c206ea3c0db1ce555464920e6b02d3a.png\" alt=\"\u0420\u0438\u0441. 1 \u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 accuracy\" title=\"\u0420\u0438\u0441. 1 \u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 accuracy\" width=\"841\" height=\"470\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/6c2\/06e\/a3c\/6c206ea3c0db1ce555464920e6b02d3a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6c2\/06e\/a3c\/6c206ea3c0db1ce555464920e6b02d3a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441. 1 \u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 accuracy<\/figcaption><\/div>\n<\/figure>\n<p>\u042d\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u0435\u0440\u0435\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435, \u0438 \u043e\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e: \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u043b\u043e, \u0432\u044b\u0445\u043e\u0434 TRIBE \u0441\u0436\u0430\u0442 \u0434\u043e 16 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, RBF-\u0446\u0435\u043d\u0442\u0440\u043e\u0432 \u0432\u0441\u0435\u0433\u043e 8, \u043d\u043e \u0447\u0438\u0441\u043b\u043e \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0430\u043a\u0443\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0438\u0433\u043d\u0430\u043b.<\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c 58% \u043d\u0430 test \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u044b\u0448\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 50%. \u042f \u0431\u044b \u043d\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u043b \u044d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0435\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0430\u043a: \u0432 TRIBE-\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0441\u043b\u0430\u0431\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0440\u0435\u043a\u043e\u0432 .<\/p>\n<h3>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438<\/h3>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a PCA \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438 \u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u0435\u0439 (\u0442. \u0435. \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \u043a\u043e\u0440\u044b),  \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 x \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u043c\u043e\u0437\u0433\u0430, \u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 w &#8212; \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u0434\u043b\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0435 \u0432\u0441\u044f \u043a\u043e\u0440\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u043c\u0443\u0437\u044b\u043a\u0443, \u0447\u0442\u043e \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0438\u0436\u0435.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0f9\/237\/f41\/0f9237f4120f08df3a03bfe0602f07be.png\" alt=\"\u0420\u0438\u0441. 2 \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 w\" title=\"\u0420\u0438\u0441. 2 \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 w\" width=\"855\" height=\"470\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/0f9\/237\/f41\/0f9237f4120f08df3a03bfe0602f07be.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0f9\/237\/f41\/0f9237f4120f08df3a03bfe0602f07be.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441. 2 \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 w<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0440\u044b, \u0430\u00a0\u0441\u043a\u0430\u043b\u044f\u0440 v\u00a0\u2014 \u0442\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u00ab\u043e\u043a\/\u043d\u0435 \u043e\u043a\u00bb \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0449\u0443\u0449\u0430\u0435\u0442\u0441\u044f.<\/p>\n<h3>\u0412\u044b\u0432\u043e\u0434<\/h3>\n<p>\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043d\u0435\u00a0\u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u043c\u0443\u0437\u044b\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e \u00ab\u043c\u043e\u0437\u0433\u043e\u0432\u044b\u043c\u00bb \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430\u043c. \u041e\u043d \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0443\u0437\u043a\u0443\u044e \u0432\u0435\u0449\u044c: \u0435\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c TRIBE \u043a\u0430\u043a\u00a0\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u044d\u043a\u0441\u0442\u0440\u0430\u043a\u0442\u043e\u0440, \u0441\u0436\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u044b\u0445\u043e\u0434 \u0434\u043e 16\u00a0\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438 \u043e\u0431\u0443\u0447\u0438\u0442\u044c RBF\u2011\u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430\u00a0\u043f\u043e\u043f\u0430\u0440\u043d\u043e\u043c \u0440\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0440\u0435\u043a\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f test accuracy \u043e\u043a\u043e\u043b\u043e 58% \u043f\u0440\u043e\u0442\u0438\u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 50%.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u043e. \u0414\u043b\u044f\u00a0\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e baseline\u00a0\u2014 \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e: \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c, \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f, \u043b\u043e\u0441\u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0435, \u0430\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441\u00a0\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u0438\u043b\u044c\u043d\u044b\u043c\u0438 \u0430\u0443\u0434\u0438\u043e\u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0434\u043b\u044f\u00a0\u043c\u0435\u043d\u044f: \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u0447\u0435\u0441\u0442\u043d\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u00ab\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u043c\u0443\u0437\u044b\u043a\u0438\u00bb. \u041d\u043e\u00a0\u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u043b\u0430\u0431\u043e\u0433\u043e \u0440\u0430\u043d\u0436\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432\u00a0\u043d\u0435\u0439\u0440\u043e\u0444\u0438\u0437\u0438\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0430\u0443\u0434\u0438\u043e. \u0418 \u0432\u00a0\u044d\u0442\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435\u00a0\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c, \u0445\u043e\u0442\u044f \u0434\u043e\u00a0\u0443\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0435\u0449\u0451 \u0434\u0430\u043b\u0435\u043a\u043e.<\/p>\n<p><em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430: Virality Predictor. \u0421\u0442\u0430\u0442\u044c\u044f \u0431\u044b\u043b\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0437\u0430\u00a0\u0434\u0435\u043d\u044c \u0434\u043e\u00a0\u0432\u044b\u0445\u043e\u0434\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430, \u0438 \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c, \u043a\u0430\u043a\u00a0\u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u2011\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0439 self\u2011made \u0430\u043d\u0430\u043b\u043e\u0433.<\/em><\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1041184\/\">https:\/\/habr.com\/ru\/articles\/1041184\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041e\u0449\u0443\u0449\u0435\u043d\u0438\u0435\u00a0\u2014 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0442\u0440\u0435\u043a \u0438\u043b\u0438\u00a0\u043d\u0435\u0442, \u0445\u043e\u0447\u0435\u0442\u0441\u044f\u00a0\u043b\u0438 \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0432\u0443\u043a\u0430 \u043c\u043e\u0437\u0433\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u00ab\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u00bb \u043c\u0443\u0437\u044b\u043a\u0438 \u043f\u043e\u00a0\u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c \u0438\u043b\u0438\u00a0\u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0430\u043c, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0446\u0435\u043d\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0440\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0430\u0443\u0434\u0438\u043e, \u0430\u00a0\u0437\u0430\u0442\u0435\u043c \u0443\u0436\u0435 \u043f\u043e\u00a0\u044d\u0442\u0438\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u0442\u0440\u0435\u043a\u043e\u0432. \u0414\u043b\u044f\u00a0\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c TRIBE. TRIBE\u00a0\u2014 \u044d\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c brain encoding: \u043e\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0442\u0438\u043c\u0443\u043b \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u043e\u0442\u043a\u043b\u0438\u043a \u043e\u043d \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0432\u00a0\u043a\u043e\u0440\u0435 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043c\u043e\u0437\u0433\u0430. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e TRIBE \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u00a0\u0432\u0438\u0434\u0435\u043e \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0442\u0440\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432\u00a0\u2014 \u0442\u0435\u043a\u0441\u0442, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0437\u0432\u0443\u043a. \u0412\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0443\u0434\u0438\u043e: \u0430\u0443\u0434\u0438\u043e \u0444\u0430\u0439\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043d\u0430\u00a0\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0440\u044b.\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435. \u041d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u0434\u0430\u0451\u0442\u0441\u044f \u0430\u0443\u0434\u0438\u043e \u0444\u0430\u0439\u043b, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 &#8212; \u043c\u0430\u0442\u0440\u0438\u0446\u0430:\u0433\u0434\u0435 T\u00a0\u2014 \u0447\u0438\u0441\u043b\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432, \u0430\u00a0D\u00a0\u2014 \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432 \u043a\u043e\u0440\u043a\u043e\u0432\u043e\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438. D \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 20\u00a0\u0442\u044b\u0441\u044f\u0447, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u043a\u043e\u0440\u044b. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043e\u0434\u0438\u043d \u0442\u0440\u0435\u043a \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f  \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0443 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043c\u043e\u0437\u0433\u0430 \u043f\u043e \u043c\u0435\u0440\u0435 \u0437\u0432\u0443\u0447\u0430\u043d\u0438\u044f \u043c\u0443\u0437\u044b\u043a\u0438.\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Free Music Archive (\u0434\u0430\u043b\u0435\u0435 FMA): \u044d\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 Music Information Retrieval: \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0436\u0430\u043d\u0440\u043e\u0432, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439, \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0445\u043e\u0436\u0435\u0439 \u043c\u0443\u0437\u044b\u043a\u0438, \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u043b\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f FMA \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 100 \u0442\u044b\u0441\u044f\u0447 \u0442\u0440\u0435\u043a\u043e\u0432, \u043d\u043e \u0432 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442 small: 8000 mp3-\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e 30 \u0441\u0435\u043a\u0443\u043d\u0434, 8 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0436\u0430\u043d\u0440\u043e\u0432. \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u0430\u0436\u0435\u043d \u043d\u0435 \u0436\u0430\u043d\u0440, \u0430 \u043f\u043e\u043b\u044f \u0438\u0437 tracks.csv: \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0440\u0435\u043a\u0430, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0430\u043b\u044c\u0431\u043e\u043c\u0430 \u0438 \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0439.\u0418\u0434\u0435\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u0442\u0430\u043a\u0430\u044f: \u0435\u0441\u043b\u0438 TRIBE \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432 \u0441\u0432\u043e\u0438\u0445 \u0432\u044b\u0445\u043e\u0434\u0430\u0445 \u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0437\u0432\u0443\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043e\u0437\u0433\u043e\u043c, \u0442\u043e \u0432 \u044d\u0442\u0438\u0445 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0430\u0431\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 \u0442\u0440\u0435\u043a \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u0447\u0430\u0449\u0435. \u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0442\u0430\u043a: \u0432\u0437\u044f\u0442\u044c \u0434\u0432\u0430 \u0442\u0440\u0435\u043a\u0430 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u0430 \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u0438\u0437\u00a0\u043d\u0438\u0445 \u043d\u0430\u0431\u0440\u0430\u043b \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0439. \u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e\u00a0\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u0430\u00a0\u2014 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u043b\u043e\u0445\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0430\u0440\u0442\u0438\u0441\u0442\u0430\u043c\u0438 \u0438 \u0440\u0435\u043b\u0438\u0437\u0430\u043c\u0438: \u0443\u00a0\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f 10\u00a0\u0442\u044b\u0441\u044f\u0447 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0439 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0432\u0430\u043b\u043e\u043c, \u0443\u00a0\u0434\u0440\u0443\u0433\u043e\u0433\u043e\u00a0\u2014 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u0438. \u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0442\u0430\u043a\u043e\u0439:\u0432\u0437\u044f\u0442\u044c \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e FMA small (\u043d\u0435 \u0432\u0435\u0441\u044c \u0434\u0430\u0442\u0430\u0441\u0435\u0442, \u0442\u0430\u043a \u043a\u0430\u043a TRIBE \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430 \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c);\u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u043a\u0438 \u043f\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u0430\u043c;\u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0440\u0435\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0439 \u0438\u0437 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445;\u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u0430\u0443\u0434\u0438\u043e \u0447\u0435\u0440\u0435\u0437 TRIBE \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432;\u0441\u0436\u0430\u0442\u044c \u0432\u044b\u0445\u043e\u0434 TRIBE \u0447\u0435\u0440\u0435\u0437 StandardScaler -&gt; PCA -&gt; StandardScaler;\u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0430\u0440\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u0430;\u043e\u0431\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e RBF-\u0441\u0435\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0434\u0430\u0451\u0442 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \u0442\u0440\u0435\u043a\u0430;\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c accuracy \u043d\u0430 \u043f\u0430\u0440\u0430\u0445: \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0440\u0435\u043a \u0432\u044b\u0448\u0435.\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u043e\u043a\u043e\u043b\u043e 85% pairwise accuracy \u043d\u0430\u00a0train \u0438 \u043e\u043a\u043e\u043b\u043e 58% \u043d\u0430\u00a0test. \u042d\u0442\u043e \u0441\u043b\u0430\u0431\u044b\u0439, \u043d\u043e\u00a0\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b. \u041d\u0438\u0436\u0435\u00a0\u2014 \u043a\u0430\u043a\u00a0\u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d \u0431\u044b\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d.\u0427\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u041d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0435\u0441\u0442\u044c \u0442\u0440\u0435\u043a. \u041f\u043e\u0441\u043b\u0435 TRIBE \u043e\u043d \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f  \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u041e\u0431\u0443\u0447\u0430\u0435\u043c\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u043a\u0430\u043b\u044f\u0440 f(X) \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0440\u0435\u043a\u0430. \u0414\u043b\u044f \u043f\u0430\u0440\u044b \u0442\u0440\u0435\u043a\u043e\u0432 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f:\u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e\u0435 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435. \u041e\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u0435\u0435 \u043a \u0440\u0430\u0437\u043d\u044b\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u0430\u043b\u044c\u0431\u043e\u043c\u0430\u043c\u0438, \u0436\u0430\u043d\u0440\u0430\u043c\u0438 \u0438 \u0430\u0440\u0442\u0438\u0441\u0442\u0430\u043c\u0438. \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 FMA\u0412 FMA \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 tracks.csv \u0441 \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c. \u0414\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043d\u0443\u0436\u043d\u044b \u0442\u0440\u0438 \u043f\u043e\u043b\u044f:track_id &#8212; \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 mp3-\u0444\u0430\u0439\u043b;album_id &#8212; \u0447\u0442\u043e\u0431\u044b \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f;track\/listens &#8212; \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0435 \u043a\u0430\u043a \u0440\u0435\u0439\u0442\u0438\u043d\u0433.\u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445:from pathlib import Pathimport pandas as pdMETA_DIR = Path(&#171;data\/fma_metadata&#187;)TRACKS_CSV = META_DIR \/ &#171;tracks.csv&#187;tracks = pd.read_csv(      TRACKS_CSV,    index_col=0,     header=[0, 1],     engine=&#187;python&#187;,      on_bad_lines=&#187;skip&#187;,)tracks = tracks[tracks[(&#171;set&#187;, &#171;subset&#187;)] == &#171;small&#187;].copy()tracks[&#171;track_id&#187;] = tracks.index.astype(int)tracks[&#171;album_id&#187;] = tracks[(&#171;album&#187;, &#171;id&#187;)]tracks[&#171;popularity&#187;] = tracks[(&#171;track&#187;, &#171;listens&#187;)]tracks = tracks[[&#171;track_id&#187;, &#171;album_id&#187;, &#171;popularity&#187;]].dropna()\u0410\u043b\u044c\u0431\u043e\u043c\u044b \u0441 1-2 \u0442\u0440\u0435\u043a\u0430\u043c\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b: \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0438\u0445  \u043d\u0435\u0447\u0435\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u044b, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0443\u043c 3 \u0442\u0440\u0435\u043a\u0430:MIN_TRACKS_IN_ALBUM = 3album_sizes = tracks.groupby(&#171;album_id&#187;).size()valid_album_ids = album_sizes[album_sizes &gt;= MIN_TRACKS_IN_ALBUM].indextracks = tracks[tracks[&#171;album_id&#187;].isin(valid_album_ids)].copy()\u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 train\/test \u0442\u043e\u0436\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u0430\u043c.import randomSEED = 42TEST_FRAC = 0.2rng = random.Random(SEED)album_ids = list(tracks[&#171;album_id&#187;].unique())rng.shuffle(album_ids)n_test = int(len(album_ids) * TEST_FRAC)test_albums = set(album_ids[:n_test])train_albums = set(album_ids[n_test:])tracks[&#171;split&#187;] = tracks[&#171;album_id&#187;].apply(    lambda album_id: &#171;test&#187; if album_id in test_albums else &#171;train&#187;)\u0424\u0430\u0439\u043b\u044b \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u0442\u0430\u043a:data\/fma_dataset\/  train\/            album_123\/             000001.mp3                000002.mp3               ratings.json     test\/           album_456\/           000101.mp3               000102.mp3               ratings.jsonratings.json \u0445\u0440\u0430\u043d\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043f\u043a\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u0430:{      &#171;000001&#187;: 1534,     &#171;000002&#187;: 847,      &#171;000003&#187;: 2681}\u041d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u0430\u0440 \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0430\u043b\u044c\u0431\u043e\u043c\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c: \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0430\u0442\u0440\u0438\u0446 \u0442\u0440\u0435\u043a\u043e\u0432 \u043f\u043b\u044e\u0441 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u0440 (better_idx, worse_idx).\u041f\u0440\u043e\u0433\u043e\u043d \u0430\u0443\u0434\u0438\u043e \u0447\u0435\u0440\u0435\u0437 TRIBETRIBE \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u044d\u043a\u0441\u0442\u0440\u0430\u043a\u0442\u043e\u0440 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432.  \u041a\u043e\u0434 \u043d\u0438\u0436\u0435  \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441 \u0431\u0435\u0437 \u0434\u0435\u0442\u0430\u043b\u0435\u0439.from pathlib import Pathimport numpy as npfrom tribev2.demo_utils import TribeModelDATASET_PATH = Path(&#171;data\/fma_dataset&#187;)CACHE_DIR = Path(&#171;cache\/tribe&#187;)model = TribeModel.from_pretrained(             &#171;facebook\/tribev2&#187;,              cache_folder=str(CACHE_DIR))for audio_path in sorted(DATASET_PATH.rglob(&#171;*.mp3&#187;)):   events = model.get_events_dataframe(audio_path=str(audio_path))    events = events[events[&#171;type&#187;] == &#171;Audio&#187;]     preds, segments = model.predict(events=events)     preds = np.asarray(preds, dtype=np.float32)     np.save(audio_path.with_suffix(&#171;.npy&#187;), preds)\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0440\u044f\u0434\u043e\u043c \u0441 \u043a\u0430\u0436\u0434\u044b\u043c mp3 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f npy:000001.mp3000001.npyratings.jsonT \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0435\u043a\u0430 \u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a TRIBE \u0440\u0435\u0436\u0435\u0442 \u0430\u0443\u0434\u0438\u043e \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. D \u0432\u0435\u043b\u0438\u043a\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u043e\u0431\u0443\u0447\u0430\u0442\u044c \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0432\u044b\u0445\u043e\u0434\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0437-\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438.\u0421\u0436\u0430\u0442\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 TRIBE\u0421\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u0437\u043e\u043d\u044b \u043c\u043e\u0437\u0433\u0430 \u0432 \u0442\u0430\u043a\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434 RBF-\u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u0436\u0430\u0442\u0438\u0435:PCA \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 16 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 (explained variance ~ 95%): from pathlib import Pathimport joblibimport numpy as npfrom sklearn.pipeline import Pipelinefrom sklearn.decomposition import PCAfrom sklearn.preprocessing import StandardScalerDATASET_PATH = Path(&#171;data\/fma_dataset&#187;)PREPROCESSOR_PATH = Path(&#171;models\/preprocessor.pkl&#187;)N_COMPONENTS = 16npy_files = sorted((DATASET_PATH \/ &#171;train&#187;).rglob(&#171;*.npy&#187;))blocks = []for path in npy_files:      x = np.load(path)      blocks.append(x.astype(np.float32))X_train_frames = np.concatenate(blocks, axis=0)preprocessor = Pipeline([                             (&#171;scaler_1&#187;, StandardScaler()),      (&#171;pca&#187;, PCA( n_components=N_COMPONENTS, svd_solver=&#187;randomized&#187;, random_state=42, )),      (&#171;scaler_2&#187;, StandardScaler()),])X_debug = preprocessor.fit_transform(X_train_frames)pca = preprocessor.named_steps[&#171;pca&#187;]PREPROCESSOR_PATH.parent.mkdir(parents=True, exist_ok=True)joblib.dump(preprocessor, PREPROCESSOR_PATH)\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0440\u0435\u043a \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439:\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0440 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f\u0427\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0435\u043b\u0438\u0437\u0430, \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u0438, \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f \u0432 \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0438, \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0430\u0440\u0442\u0438\u0441\u0442\u0430, \u043e\u0431\u043b\u043e\u0436\u043a\u0438 \u0438 \u0435\u0449\u0451 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u043e\u0431\u0443\u0447\u0430\u0442\u044c \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044e audio -&gt; listens, \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0430\u0443\u0434\u0438\u043e\u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c \u0442\u043e, \u0447\u0435\u0433\u043e \u0432 \u0430\u0443\u0434\u0438\u043e \u043d\u0435\u0442.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c pairwise ranking. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u043f\u0430\u0440\u044b \u0442\u0440\u0435\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0442\u0440\u0435\u043a \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0439, \u043e\u043d \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f better, \u0432\u0442\u043e\u0440\u043e\u0439 &#8212; worse. \u041d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u0436\u0435 \u043f\u043b\u043e\u0445\u043e: \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 1000 \u0438 1020 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0448\u0443\u043c\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c, \u0430 \u043f\u0430\u0440\u044b \u0441 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f.\u0414\u043b\u044f \u0430\u043b\u044c\u0431\u043e\u043c\u0430 \u0441 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u0430\u043c\u0438 r_i:\u041f\u0430\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438:\u0433\u0434\u0435  &#8212; \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u0430.\u041a\u043e\u0434 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u0430\u0440:from itertools import combinationsimport numpy as npMIN_SIGMA_TO_COMPARE = 1.0EPS = 1e-8def build_album_pairs(ratings):      scores = np.asarray(ratings, dtype=np.float32)      log_scores = np.log10(scores + EPS)      sigma = np.std(log_scores)      threshold = MIN_SIGMA_TO_COMPARE * sigma      pairs = []      for i, j in combinations(range(len(log_scores)), 2):            diff = abs(log_scores[i] &#8212; log_scores[j])            if diff &lt; threshold:                  continue            if log_scores[i] &gt; log_scores[j]:      pairs.append((i, j))            else:                  pairs.append((j, i))      return pairs\u0417\u0434\u0435\u0441\u044c (i, j) \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442: \u0442\u0440\u0435\u043a i \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0446\u0435\u043d\u043a\u0443 \u0432\u044b\u0448\u0435, \u0447\u0435\u043c \u0442\u0440\u0435\u043a j.\u0421\u0431\u043e\u0440\u043a\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0430\u043b\u044c\u0431\u043e\u043c\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:dataset = [               {                    &#171;tracks&#187;: [track_matrix_0, track_matrix_1, &#8230;],                   &#171;pairs&#187;: [(better_idx, worse_idx), &#8230;],               },              &#8230;,]\u041a\u043e\u0434:from pathlib import Pathimport jsonimport joblibimport numpy as npDATASET_PATH = Path(&#171;data\/fma_dataset&#187;)PREPROCESSOR_PATH = Path(&#171;models\/preprocessor.pkl&#187;)preprocessor = joblib.load(PREPROCESSOR_PATH)def load_split(split_name):      split_dir = DATASET_PATH \/ split_name      albums = []      for album_dir in sorted(p for p in split_dir.iterdir() if p.is_dir()):    with open(album_dir \/ &#171;ratings.json&#187;, &#171;r&#187;, encoding=&#187;utf-8&#8243;) as f:      ratings_dict = json.load(f)      tracks = []      ratings = []      for npy_path in sorted(album_dir.glob(&#171;*.npy&#187;)):        track_name = npy_path.stem        if track_name not in ratings_dict:          continue                   x = np.load(npy_path)         x = preprocessor.transform(x).astype(np.float32)                tracks.append(x)&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-481585","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481585","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=481585"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481585\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=481585"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=481585"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=481585"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}