Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对数回归线不直,对数值为负?_Python_Numpy_Matplotlib_Plot_Regression - Fatal编程技术网

Python 对数回归线不直,对数值为负?

Python 对数回归线不直,对数值为负?,python,numpy,matplotlib,plot,regression,Python,Numpy,Matplotlib,Plot,Regression,我有一个相关图,我试图用对数标度来显示数值。我试图在相关图上显示最佳拟合线 下面是我的代码 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

我有一个相关图,我试图用对数标度来显示数值。我试图在相关图上显示最佳拟合线

下面是我的代码

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()
当使用
logplot(seed=5)
运行时,我得到以下图像

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

我预先弄明白了为什么在x=1之前,回归线没有绘制成一条直线。我做错了什么

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

Seed=5表示:

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
导入numpy
从matplotlib导入rcParams,pyplot
从scipy导入统计信息
def日志图(种子):
rcParams.update({'font.size':10})
figh,figw=1.80118*2,1.80118*2
图,轴=pyplot.子图(1,1,figsize=(figh,figw))
axes.setxscale('log'))
轴。设置刻度('log')
numpy.random.seed(种子)
x=10**numpy.random.uniform(-3,3,大小=1000*4)
y=x*10**numpy.random.uniform(-1,1,大小=1000*4)
轴散射(x,y,颜色=黑色,s=10,α=0.1)
logx=numpy.log(x)#一致性
坐标轴绘图(xhat,yhat,color='red',lw=2)
轴设置(10**-4,10**4))
轴设置Y轴((10**-4,10**4))
返回图

尝试使用
np.logspace(-4,4,N)
而不是
np.arange来生成xps
。尝试过,但没有多大帮助。请检查问题中的编辑以查看更改后的图像。您需要将最佳拟合参数转换回其原始单位。对不起,您能告诉我应该在哪里执行此操作吗?我想我是在日志转换空间本身中绘制所有内容,而这些内容或多或少都是相同的。
slope*xps+intercept
不是在日志空间中执行的