Size: a a a

2021 October 09

FO

FORTRAN ONE LOVE in Rude Python
Ой. Странно... Мне просто непривычно было, но я на самолете
источник

AF

An Feldman in Rude Python
До завтра прочитай правила чата.
источник

NE

Nikita Eliseev in Rude Python
Кто своими руками писал KNN с весами (не только с единицами)?  Как через функцию scipy.special.softmax создать матрицу весов? На вход подавать нужно трейновые иксы(датасет делю на игрики(ответы) и иксы(значения))?
источник

DK

Denis Kalinochkin in Rude Python
Зачем в knn softmax?
источник

NE

Nikita Eliseev in Rude Python
Задача посчитать веса по этой формуле
источник

DK

Denis Kalinochkin in Rude Python
Берешь numpy, пишешь на нем эту формулу, считаешь
источник

NE

Nikita Eliseev in Rude Python
Как для этой функции должна выглядеть матрица весов?
источник

В

Владимир in Rude Python
Но софтмакс же монотонная возрастающая функция, для кнн вроде как ничего не поменяет, разве нет?
источник

NE

Nikita Eliseev in Rude Python
и через нампай не советуют делать, мол численно неустойчивым может быть вычисление
источник

DK

Denis Kalinochkin in Rude Python
Какие-то вычматы пошли, я пас
источник

NE

Nikita Eliseev in Rude Python
Что нужно подавать в матрицу весов вообще: ответы или значения?
источник

DK

Denis Kalinochkin in Rude Python
Какую матрицу весов? Напиши что ли, какую задачу ты решаешь
источник

NE

Nikita Eliseev in Rude Python
Вам предстоит реализовать две версии метода  𝑘  ближайших соседей (kNN) — обычный (который обсуждался на семинаре) и со взвешиванием.

В качестве метрики мы будем использовать  𝑑𝑝(⋅, ⋅)  — расстояние Минковского порядка  𝑝 .

Пусть нам нужно вычислить значение  𝑦  для некоторого  𝑥𝑛𝑒𝑤 , наши данные заданы как  {𝑥𝑖,𝑦𝑖}𝑙𝑖=1 . Обычный метод  𝑘  ближайших соседей находит такие  𝑖1,…,𝑖𝑘 , что  {𝑥𝑖𝑚}𝑘𝑚=1  являются  𝑘  ближайшими соседями для точки  𝑥𝑛𝑒𝑤  (по выбранной метрике  𝑑𝑝(⋅, ⋅) ), и полагает, что значение нового объекта:

𝑦ˆ=argmax𝑐∈𝐶 ∑𝑚=1𝑘[𝑦𝑖𝑚=𝑐],

где  𝐶  — множество классов, а  [𝑦𝑖𝑚=𝑐]  — выражение, равное 1, если  𝑦𝑖𝑚=𝑐 , и 0 в противном случае. То есть  𝑦ˆ  — мода классов  𝑘  ближайших соседей. Модифицированный метод  𝑘  ближайших соседей, который вам предстоит реализовать, использует другую оценку:

𝑦ˆ=argmax𝑐∈𝐶∑𝑖=1𝑙𝑤𝑖[𝑦𝑖=𝑐],

где вес  𝑤𝑖  вычисляется следующим образом:
𝑤𝑖=exp(−𝑑𝑝(𝑥𝑛𝑒𝑤,𝑥𝑖))∑𝑙𝑗=1exp(−𝑑𝑝(𝑥𝑛𝑒𝑤,𝑥𝑗))

Таким образом, модифицированный метод присваивает  𝑖 -му объекту вес  𝑤𝑖 , уменьшающийся с увеличением расстояния до  𝑥𝑛𝑒𝑤 , вместо того чтобы присваивать  𝑘  ближайшим соседям вес  1 , а остальным  0 .

Ниже предоставлен шаблон функции для реализации метода, который возвращает предсказания для тестовой выборки, используя взвешенный или обычный kNN (с возможностью выбора порядка  𝑝  метрики расстояния).
Подсказка. Вам придётся вычислить расстояние Минковского между  𝑥𝑛𝑒𝑤  и каждой из точек  𝑥𝑖 ,  𝑖=1,…,𝑙 . Существует библиотечная функция, которая позволяет это сделать быстро и без циклов. Вам нужно найти её и использовать.

Внимание! Вычисление весов  𝑤𝑖  исключительно через функции np.sum и np.exp может быть численно неустойчивым. Воспользуйтесь функцией scipy.special.softmax.
источник

NE

Nikita Eliseev in Rude Python
Код прислал скриншотом
источник

BB

Boris Bobejko in Rude Python
код скриншотом
источник

BB

Boris Bobejko in Rude Python
вас в одном ротдоме всех на кафельный пол роняли что ли?
источник

DK

Denis Kalinochkin in Rude Python
Судя по тому, что ты кинул, надо брать софтмакс от расстояний
источник

NE

Nikita Eliseev in Rude Python
ну могу и так скинуть, подумал просто, что так удобнее будет)
источник

NE

Nikita Eliseev in Rude Python
Попробую
источник

NE

Nikita Eliseev in Rude Python
import numpy as np
import pandas as pd
import scipy as sp
import matplotlib.pyplot as plt
%matplotlib inline
from scipy import special
from scipy import spatial
from sklearn.neighbors import KNeighborsClassifier


def knn_classifier(x_train, y_train, x_test, k=1, distance='euclid',
                  weight=True):
   """
   x_train is np.array with shape (l, d) (matrix with l rows, d columns)
   y_train is np.array with shape (l, ) (1-dimensional array with l elements)
   x_test is np.array with shape (n, d) (matrix with n rows, d columns)
   k is int (if weight is True, then the argument is ignored, else - number of neighbours)
   distance is int (order p of Minkowski distance) or str: 'euclidian', 'cityblock' (you can implement more options)
   weight is boolean, whether to use the weighted method or not

   return y_test, np.array with shape (n, ) (1-dimensional array with n elements)
   """
   ### SOLUTION BEGIN
   distances_sq = sp.spatial.distance.cdist(x_train, x_test, metric = 'minkowski', p = 2)
   weights = sp.special.softmax(distances_sq, axis = 1)
   print(weights)
   y_test = sp.stats.mode(weights * y_train)
   return y_test
   ### SOLUTION END
if name == "main":
   knn_classifier(x_train = np.array([[12, 3],
                                      [4, 5],
                                      [1, 5]]),
                  y_train = np.array([10, 20, 30]).transpose(),
                  x_test = np.array([[20, 4],
                                   [15, 0],
                                   [1, 4],
                                   [-2, 5]]),
                  k = 2)
источник