LogLog回归线不是对数为负的直线吗?

时间:2019-02-07 03:59:07

标签: python numpy matplotlib plot regression

我有一个相关图,我试图在其中显示对数对数刻度的值。我正在尝试在相关图上显示最佳拟合线。

以下是我的代码。

values_by_name

使用>>> commands_descriptor = defaultPacket.Commands.DESCRIPTOR >>> 'QUIT' in commands_descriptor.values_by_name >>> 2 in commands_descriptor.values_by_number 运行时,我得到以下图像。

LogLog function invocation with seed=5

使用import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt from scipy import stats def loglogplot(seed): mpl.rcParams.update({'font.size': 10}) figh, figw = 1.80118*2, 1.80118*2 fig, axes = plt.subplots(1, 1, figsize=(figh, figw)) axes.set_xscale('log') axes.set_yscale('log') np.random.seed(seed) x = 10 ** np.random.uniform(-3, 3, size=1000*4) y = x * 10 ** np.random.uniform(-1, 1, size=1000*4) axes.scatter(x, y, color='black', s=10, alpha=0.1) logx = np.log10(x) logy = np.log10(y) slope, intercept, r_value, p_value, std_err = stats.linregress(logx, logy) xps = np.arange(10**-4, 10**4, 1) axes.plot(xps, slope * xps + intercept, color='red', lw=2) axes.set_xlim((10**-4, 10**4)) axes.set_ylim((10**-4, 10**4)) plt.show() 运行时,我得到以下图像。

LogLog function invocation with seed=5

我困惑为什么不将回归线绘制为x = 1之前的直线。我在做什么错了?

编辑:将loglogplot(seed=5)更改为loglogplot(seed=10),结果在质量上没有更好的表现。

种子= 5给出:

LogSpace points between -4 and 4 for seed=5

种子= 10给出:

LogSpace points between -4 and 4 for seed=10

1 个答案:

答案 0 :(得分:2)

问题的症结在于,对数刻度不会转换数据,而是转换数据在纸张空间中的显示位置。这意味着,您不能采用对数转换的最佳参数并将其用于非对数转换的数据并正确绘制。

您要么需要对数据进行日志转换,然后直接使用它们,要么需要考虑实际建模的关系并(必要时撤消)。

通过拟合数据日志,您可以满足以下方程式:

log(y) = m * log(x) + p

使用数学,结果变为:

y = exp(p) * (x ^ m)

因此您的代码变为:

import numpy
from matplotlib import rcParams, pyplot
from scipy import stats

def loglogplot(seed):
    rcParams.update({'font.size': 10})
    figh, figw = 1.80118*2, 1.80118*2    
    fig, axes  = pyplot.subplots(1, 1, figsize=(figh, figw))

    axes.set_xscale('log')
    axes.set_yscale('log')

    numpy.random.seed(seed)
    x = 10 ** numpy.random.uniform(-3, 3, size=1000*4)
    y = x * 10 ** numpy.random.uniform(-1, 1, size=1000*4)
    axes.scatter(x, y, color='black', s=10, alpha=0.1)

    logx = numpy.log(x)  # <-- doesn't matter that we use natural log
    logy = numpy.log(y)  #     so long as we're consistent

    slope, intercept, r_value, p_value, std_err = stats.linregress(logx, logy)
    xhat = numpy.logspace(-4, 4, 1000)
    yhat = numpy.exp(intercept) * xhat ** slope  # exp -> consistency
    axes.plot(xhat, yhat, color='red', lw=2)    

    axes.set_xlim((10**-4, 10**4))
    axes.set_ylim((10**-4, 10**4))

    return fig

enter image description here