gpt4 book ai didi

python - LogLog 回归线不直且对数值为负数?

转载 作者:太空宇宙 更新时间:2023-11-04 02:06:42 26 4
gpt4 key购买 nike

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

以下是我的代码。

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()

当使用 loglogplot(seed=5) 运行时,我得到以下图像。

LogLog function invocation with seed=5

当使用 loglogplot(seed=10) 运行时,我得到以下图像。

LogLog function invocation with seed=5

我很困惑为什么,回归线在 x=1 之前没有绘制成直线。我做错了什么?

编辑:将 xps = np.arange(10**-4, 10**4, 1) 更改为 xps = np.logspace(-4, 4, 1000),结果在质量上并没有更好。

种子 = 5 给出:

LogSpace points between -4 and 4 for seed=5

种子 = 10 给出:

LogSpace points between -4 and 4 for seed=10

最佳答案

这里问题的症结在于,对数比例不会转换数据,而是转换数据在图纸空间中的显示位置。这意味着,您不能采用对数转换的最佳拟合参数并将它们用于非对数转换的数据,并正确绘制它。

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

通过拟合数据的日志,您已拟合以下等式:

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

关于python - LogLog 回归线不直且对数值为负数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54566099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com