Построение линейной регрессии для геометрической интуицииPython

Программы на Python
Ответить
Anonymous
 Построение линейной регрессии для геометрической интуиции

Сообщение Anonymous »

Я регрессирую Y~(X1, X2) так, чтобы это соответствие было идеальным (R в квадрате равно 1), где R в квадрате для Y~X1 и Y~X2 выбираются где-то в интервале $(0,1)$. Я пытаюсь создать числовой пример на основе превосходного ответа Silverfish на этот вопрос, чтобы понять, как значения R в квадрате связаны с углами между данными.
Мне удалось создать код для этого примера, но я не совсем уверен, как согласовать углы, которые я получаю из моего кода, с графиком, на который я смотрю.

Код: Выделить всё

import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression

import math

Angle1 = 45
Angle2 = 120

# u, v computed from https://stats.stackexchange.com/questions/164586/can-the-coefficient-of-determination-r2-be-more-than-one-what-is-its-upper-b
Rad1, Rad2 = math.radians(Angle1), math.radians(Angle2)
Rsquared1, Rsquared2 = math.cos(Rad1)**2, math.cos(Rad2)**2
p1, p2 = np.sqrt(Rsquared1), np.sqrt(Rsquared2)

u = (np.array([2, -1, -1])/np.sqrt(6)).reshape(-1, 1)
v = (np.array([0, 1, -1])/np.sqrt(2)).reshape(-1, 1)

# define X and Y
X1, X2 = u, p1 * u + np.sqrt(1-p1**2)*v
X = np.hstack((X1, X2))
Y = (p1*p2 - np.sqrt(1-p1**2)*np.sqrt(1-p2**2))*u + (p1*np.sqrt(1-p1**2)*np.sqrt(1-p2**2))*v

# Fit joint regression
model = LinearRegression(fit_intercept=False)
model.fit(X, Y)
Yh = model.predict(X)
e = Y - Yh

# Fit univariate regressions
model1 = LinearRegression(fit_intercept=False)
model1.fit(X1, Y)
Y1 = model1.predict(X1)

model2 = LinearRegression(fit_intercept=False)
model2.fit(X2, Y)
Y2 = model2.predict(X2)

costheta = np.linalg.norm(Yh - np.mean(Y)) / np.linalg.norm(Y - np.mean(Y))
costheta1 = np.linalg.norm(Y1 - np.mean(Y)) / np.linalg.norm(Y - np.mean(Y))
costheta2 = np.linalg.norm(Y2 - np.mean(Y)) / np.linalg.norm(Y - np.mean(Y))

print(f"Angle1 = {Angle1}")
print(f"Angle2 = {Angle2}")
print(f"Rsquared1 = {Rsquared1}")
print(f"Rsquared2 = {Rsquared2}")

print(f"cos(theta)^2 = {costheta ** 2}")
print(f"cos(theta1)^2 = {costheta1 ** 2}")
print(f"cos(theta2)^2 = {costheta2 ** 2}")

print(f"theta:  {math.degrees(math.acos(costheta))}")
print(f"theta1:  {math.degrees(math.acos(costheta1))}")
print(f"theta2:  {math.degrees(math.acos(costheta2))}")
Я понимаю

Код: Выделить всё

Angle1 = 45
Angle2 = 120
Rsquared1 = 0.5000000000000001
Rsquared2 = 0.24999999999999983
cos(theta)^2 = 1.0
cos(theta1)^2 = 0.2632245247831985
cos(theta2)^2 = 0.05961678695043583
theta:  0.0
theta1:  59.13252220932562
theta2:  75.86747779067439
Углы theta, theta1 и theta2 кажутся правильными, поскольку их квадраты косинусов согласуются с функцией r2_score. Однако «номинальные» значения R2, ​​а именно Rsquared1 и Rsquared2, различны, но я не вижу, где находится разрыв с ответом Silverfish в ссылке выше. Разве они не должны совпадать с переменными Angle1 и Angle2, которые я установил выше, или эти углы измеряют что-то еще?
Я построил графики X1, X2, их размаха, Y1 и Y2, а также совместную регрессию Y. Прогноз «Шляпа Y», конечно, перекрывается с Y, и мы идеально подходим по замыслу. Можете ли вы помочь мне связать то, что я вижу, с ракурсами, выбранными в моем сценарии?

Подробнее здесь: https://stackoverflow.com/questions/798 ... -intuition
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»