Я регрессирую Y~(X1, X2) так, чтобы это соответствие было идеальным (R в квадрате равно 1), где R в квадрате для Y~X1 и Y~X2 выбираются где-то в интервале $(0,1)$. Я пытаюсь создать числовой пример на основе превосходного ответа Silverfish на этот вопрос, чтобы понять, как значения R в квадрате связаны с углами между данными.
Мне удалось создать код для этого примера, но я не совсем уверен, как согласовать углы, которые я получаю из моего кода, с графиком, на который я смотрю.
Углы theta, theta1 и theta2 кажутся правильными, поскольку их квадраты косинусов согласуются с функцией r2_score. Однако «номинальные» значения R2, а именно Rsquared1 и Rsquared2, различны, но я не вижу, где находится разрыв с ответом Silverfish в ссылке выше. Разве они не должны совпадать с переменными Angle1 и Angle2, которые я установил выше, или эти углы измеряют что-то другое?
Я построил графики X1, X2, их интервала, Y1 и Y2, а также совместную регрессию Y, используя этот код:
# Plot
mesh_size = 30
scale = np.max(np.abs(Y))
xs = np.linspace(-scale, scale, mesh_size)
U, V = np.meshgrid(xs, xs)
# get basis from X
q, _ = np.linalg.qr(X)
v1, v2 = q[:, 0], q[:, 1]
q1 = U * v1[0] + V * v2[0]
q2 = U * v1[1] + V * v2[1]
q3 = U * v1[2] + V * v2[2]
fig = plt.figure(figsize=(9, 7))
ax = fig.add_subplot(111, projection='3d')
# Column space of X visualised
ax.plot_surface(q1, q2, q3, alpha=0.3, color='lightblue', edgecolor='none', label='Fitted Plane')
# Plot origin and basis vectors
origin = np.array([0, 0, 0])
ax.quiver(*origin, *X1, color='r', linestyle=':', linewidth=1, label='X1')
ax.quiver(*origin, *X2, color='g', linewidth=1, linestyle=':', label='X2')
ax.quiver(*origin, *Y1, color='r', linewidth=2, label='Y ~ X1')
ax.quiver(*origin, *Y2, color='g', linewidth=2, label='Y ~ X2')
ax.quiver(*origin, *Yh, color='b', linewidth=1, label='Y ~ X = (X1, X2)')
ax.scatter(*origin, color='k', s=15, label='origin')
ax.legend()
plt.show()
Предсказание «Шляпа Y», конечно, совпадает с предсказанием Y, и по замыслу оно идеально подходит. Можете ли вы помочь мне связать то, что я вижу, с ракурсами, выбранными в моем сценарии?
Я регрессирую Y~(X1, X2) так, чтобы это соответствие было идеальным (R в квадрате равно 1), где R в квадрате для Y~X1 и Y~X2 выбираются где-то в интервале $(0,1)$. Я пытаюсь создать числовой пример на основе превосходного ответа Silverfish на этот вопрос, чтобы понять, как значения R в квадрате связаны с углами между данными. Мне удалось создать код для этого примера, но я не совсем уверен, как согласовать углы, которые я получаю из моего кода, с графиком, на который я смотрю. [code]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
print(f"theta: {math.degrees(math.acos(costheta))}") print(f"theta1: {math.degrees(math.acos(costheta1))}") print(f"theta2: {math.degrees(math.acos(costheta2))}") [/code] Я понимаю [code]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 [/code] Углы theta, theta1 и theta2 кажутся правильными, поскольку их квадраты косинусов согласуются с функцией r2_score. Однако «номинальные» значения R2, а именно Rsquared1 и Rsquared2, различны, но я не вижу, где находится разрыв с ответом Silverfish в ссылке выше. Разве они не должны совпадать с переменными Angle1 и Angle2, которые я установил выше, или эти углы измеряют что-то другое? Я построил графики X1, X2, их интервала, Y1 и Y2, а также совместную регрессию Y, используя этот код: [code]# Plot mesh_size = 30 scale = np.max(np.abs(Y)) xs = np.linspace(-scale, scale, mesh_size) U, V = np.meshgrid(xs, xs)
# get basis from X q, _ = np.linalg.qr(X) v1, v2 = q[:, 0], q[:, 1] q1 = U * v1[0] + V * v2[0] q2 = U * v1[1] + V * v2[1] q3 = U * v1[2] + V * v2[2]
fig = plt.figure(figsize=(9, 7)) ax = fig.add_subplot(111, projection='3d') # Column space of X visualised ax.plot_surface(q1, q2, q3, alpha=0.3, color='lightblue', edgecolor='none', label='Fitted Plane')
# Plot origin and basis vectors origin = np.array([0, 0, 0]) ax.quiver(*origin, *X1, color='r', linestyle=':', linewidth=1, label='X1') ax.quiver(*origin, *X2, color='g', linewidth=1, linestyle=':', label='X2') ax.quiver(*origin, *Y1, color='r', linewidth=2, label='Y ~ X1') ax.quiver(*origin, *Y2, color='g', linewidth=2, label='Y ~ X2') ax.quiver(*origin, *Yh, color='b', linewidth=1, label='Y ~ X = (X1, X2)') ax.scatter(*origin, color='k', s=15, label='origin') ax.legend() plt.show() [/code] Предсказание «Шляпа Y», конечно, совпадает с предсказанием Y, и по замыслу оно идеально подходит. Можете ли вы помочь мне связать то, что я вижу, с ракурсами, выбранными в моем сценарии?