我正在为loglog图中的大型数组尝试最佳拟合线性回归线。
import scipy.stats as stats
x = subhalos['SubhaloVmax']
y = subhalos['SubhaloMass'] * 1e10 / 0.704 # in units of M_sol h^-1
slope, intercept, r_value, p_value, slope_std_error = stats.linregress(np.log(x), np.log(y))
predict_y = intercept + slope * x
pred_error = y - predict_y
degrees_of_freedom = len(x) - 2
residual_std_error = np.sqrt(np.sum(pred_error**2) / degrees_of_freedom)
idx = np.argsort(x)
plt.plot(x,y,'k.')
plt.plot(x[idx], predict_y[idx], 'b--')
plt.xscale('log')
plt.yscale('log')
plt.xlabel('$V_{max}$ [km s$^{-1}$]')
plt.ylabel('$M_{sub} $ [$M_\odot h^{-1}$]')
plt.title(' $V_{max} - M_{sub}$ relation ')
给我这张图
我会认为我的代码会自动设置y拦截。但事实似乎并非如此。
如何将线条转换为正确的截距?
答案 0 :(得分:0)
您正在计算log(x)
与log(y)
的回归,因此您的预测应该实际计算为
predict_logy = intercept + slope * logx
然后,您是否会将残差计算为log(y) - predict_logy
或y - exp(predict_logy)
或其他内容取决于您的应用。