Объяснение и реализация единственного числа, единственного вектора и линии наилучшего соответствия
Разложение по сингулярным значениям — это общий метод, который также очень полезен для уменьшения размерности в науке о данных.
В этом руководстве я объясню, как вычислить сингулярные значения, сингулярные векторы и линию наилучшего соответствия для выборки данных.
Понимание этих терминов будет очень полезно для понимания некоторых других терминов науки о данных, таких как собственное значение, собственный вектор и анализ основных компонентов.
Я буду визуализировать данные и рассказывать концепции на графиках.
Я также буду делиться реализацией этих графиков и вычислений на Python на каждом этапе.
Начнем с импорта библиотек и компоновки данных.
Импорт библиотек, создание и визуализация данных
import numpy as np import pandas as pd import matplotlib.pyplot as plt
Итак, у нас есть 3 библиотеки для использования. Если у вас их нет, просто поищите в Google, как их установить.
Теперь давайте составим наши данные.
df = pd.DataFrame(np.array([[-1, -2], [-2, -3], [-1, -1], [6, 4], [7, 8], [6, 6]]), columns=['Feature1', 'Feature2']) df
В наших данных у нас есть 2 функции и 6 выборок.
Данных очень мало, чтобы лучше понять концепции.
Ниже представлена визуализация данных.
# Plot data plt.figure(figsize=(7,7)) plt.plot(df.Feature1, df.Feature2, 'o', color='red') plt.gca().set_aspect('equal', adjustable='box')
Найдите центр, сдвиньте данные и нарисуйте случайную линию
Я сделал простой расчет центра, а затем построил его с данными.
plt.figure(figsize=(7,7)) # Plot data plt.plot(df.Feature1, df.Feature2, 'o', color='red', label='data') # Calculate center center_x = np.sum(df.loc[:, 'Feature1'])/df.shape[0] center_y = np.sum(df.loc[:, 'Feature2'])/df.shape[0] # Print and plot center print(center_x, center_y) plt.plot(center_x, center_y, '*', color='purple', label='center') # Label plot plt.xlabel("Feature1") plt.ylabel("Feature2") plt.title("Data and Center") plt.gca().set_aspect('equal', adjustable='box') plt.legend() plt.show()
Далее мы переместим центр в начало координат.
Затем мы нарисуем случайную линию, проходящую через начало координат.
В этой строке я расскажу вам, как найти наиболее подходящую линию, сингулярные векторы и сингулярные значения.
# Move center to the origin (0,0) and move data relatively df.Feature1= df.Feature1 - center_x df.Feature2= df.Feature2 - center_y center_x = np.sum(df.loc[:, 'Feature1'])/df.shape[0] center_y = np.sum(df.loc[:, 'Feature2'])/df.shape[0] print(center_x, center_y) # Plot data and center plt.figure(figsize=(10,10)) plt.plot(df.Feature1, df.Feature2, 'o', color='red', label='data') plt.plot(center_x, center_y, '*', color='purple', label='center') # Plot a random line passing through the origin plt.plot([4, -4], [7, -7]) plt.xlabel("Feature1") plt.ylabel("Feature2") plt.title("Data and Center") plt.gca().set_aspect('equal', adjustable='box') plt.legend() plt.show()
Выше центр перемещен в начало координат (0,0).
Теперь нам нужно найти наиболее подходящую линию, вращая эту линию.
Определение линии наилучшего соответствия, сингулярного значения и сингулярного вектора
Что означает наиболее подходящая линия?
Этапы расчета
- Итак, из теоремы Пифагора;
(синяя линия)^2 + (зеленая линия)^2 = (желтая линия)^2
- Если мы повернем эту длинную случайную линию вправо, зеленая линия станет короче, синяя линия станет длиннее, а желтая линия останется на месте. сильный>.
(Желтая линия — это расстояние от точки до начала координат, поэтому оно не изменится при повороте длинной случайной линии.)
- Цель состоит в том, чтобы увеличить синюю линию и сократить зеленую линию для всех точек в данных.
- Нам нужно максимизировать приведенное ниже значение, чтобы найти наиболее подходящую строку.
(максимальное значение) = (синяя линия точки 1) ^ 2 + (синяя линия точки 2) ^ 2 + (синяя линия точки 3) ^ 2 + (синяя линия точки 4) ^ 2 + (синяя линия точки 5) ^ 2 + (синяя линия точки 6)^2
- Квадратный корень из этого значения называется единственным числом.
- Линия, которую мы получили, вращая эту длинную случайную линию, называется линии наилучшего соответствия, когда значение максимально.
- Единичный вектор на линии наилучшего соответствия называется сингулярным вектором.
Получим эти 3 термина.
Внедрение наилучшей линии
Я написал несколько функций.
def get_slope(x, y): X = np.append(np.array([x]).T, np.ones((len(x), 1)), axis=1) theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(np.array([y]).T) Y = X.dot(theta) return float(Y[0]-Y[1])/(x[0]-x[1])
Этот метод get_slope(x, y)
получает (2d) точки данных, находит наиболее подходящую линию и возвращает ее наклон.
get_slope(df.Feature1,df.Feature2)
Таким образом, мы получаем наклон линии наилучшего соответствия.
Чтобы нарисовать его, давайте получим его конечные точки.
def find_endpoints_by_slope(slope, approximate_end_points): y1 = slope y2 = -slope x1 = 1 x2 = -1 return [x1*approximate_end_points, x2*approximate_end_points], [y1*approximate_end_points, y2*approximate_end_points]
Этот метод find_endpoints_by_slope
получает 2 параметра:
- Склон
- Примерная конечная точка, которую мы хотим видеть на графике
В наших данных 6 — хороший выбор, так как данные находятся вокруг этого числа в максимальной точке.
slope = get_slope(df.Feature1,df.Feature2) find_endpoints_by_slope(slope, 6)
Теперь мы можем нарисовать нашу линию наилучшего соответствия вместе с данными.
# Obtain center center_x = np.sum(df.loc[:, 'Feature1'])/df.shape[0] center_y = np.sum(df.loc[:, 'Feature2'])/df.shape[0] # Plot data and center plt.figure(figsize=(10,10)) plt.plot(df.Feature1, df.Feature2, 'o', color='red', label='data') plt.plot(center_x, center_y, '*', color='purple', label='center') # Get and plot best-fit line slope = get_slope(df.Feature1,df.Feature2) line_points = find_endpoints_by_slope(slope, 6) print(line_points) plt.plot(line_points[0], line_points[1]) plt.xlabel("Feature1") plt.ylabel("Feature2") plt.title("Data and Best-fit line") plt.gca().set_aspect('equal', adjustable='box') plt.legend() plt.show()
Итак, точки находятся близко к линии на оптимальном уровне.
Наконец, давайте получим сингулярные значения и сингулярные векторы.
Реализуйте сингулярные векторы с объяснением
После наиболее подходящей линии легко рисовать сингулярные векторы.
Поскольку наши данные имеют 2 измерения, у нас есть 2 сингулярных вектора.
Первый сингулярный вектор является единичным вектором наилучшей прямой.
Второй сингулярный вектор — это единичный вектор, перпендикулярный первому сингулярному вектору.
Если бы у нас было 3-е измерение, 3-й сингулярный вектор был бы перпендикулярен обоим этим сингулярным векторам.
Теперь давайте получим их с помощью кода.
def get_singular_vectors(x, y): slope = get_slope(x, y) x = np.sqrt(1/((slope**2)+1)) y = x * slope return [x,y], [-y, x]
Метод get_singular_vectors
получает (2d) точки данных и возвращает единичные векторы.
get_singular_vectors(df.Feature1,df.Feature2)
Итак, мы получили сингулярные векторы!
Реализуйте сингулярные значения с объяснением
Поскольку у нас есть 2 сингулярных вектора, у нас есть 2 сингулярных значения, потому что наши данные имеют 2 измерения.
Первое единственное число — это квадратный корень из суммы квадратов этих зеленых линий выше.
Второе сингулярное значение снова представляет собой квадратный корень из суммы квадратов зеленых линий ниже, которые параллельны второму сингулярному вектору.
См. сюжет ниже.
Итак, понятно, что второе сингулярное значение будет намного меньше первого.
(Я получил этот график, только добавив знак минус перед наклоном в приведенном выше коде.)
Теперь давайте получим сингулярные значения с помощью кода.
def get_singular_values(a,b): slope = get_slope(a, b) singular_value1 = 0 for i in range(len(a)): c = (a[i] + slope*b[i])/(1+slope**2) d = c*slope singular_value1 += (c**2 + d**2) slope = -get_slope(a, b) singular_value2 = 0 for i in range(len(a)): c = (a[i] + slope*b[i])/(1+slope**2) d = c*slope singular_value2 += (c**2 + d**2) return np.sqrt(singular_value1), np.sqrt(singular_value2)
Эта функция get_singular_values
получает (2d) точки данных и возвращает сингулярные значения.
get_singular_values(df.Feature1,df.Feature2)
Итак, мы получили сингулярные значения!
Подводить итоги
В этой статье я определил наиболее подходящую линию, сингулярный вектор и сингулярное значение.
Я также даю Python реализацию этих терминов.
Понимание этих трех терминов очень полезно для понимания собственного значения, собственного вектора, PCA и т. д.
Запланируйте сеанс DDIChat в разделе Кодирование, программное обеспечение и разработка мобильных устройств:
Подайте заявку на участие в программе DDIChat Expert здесь.
Работайте с DDI: https://datadriveninvestor.com/collaborate
Подпишитесь на DDIntel здесь.