我有图中所示形式的data。数据的自然对数总是有三个不同的线性范围,但范围并不总是相同,它随数据而变化,但肯定会有三个区域可以进行三种不同的线性拟合。
我试图确定最好的三个线性拟合它的自然对数标记为I,II和III。该图显示了y数据的自然对数。这必须适用于至少数千个数据集。代码自动检测图中所示三个区域的最佳线性拟合。
我试图使用这样的代码来完成它,它尝试使用here中的代码应用两个分段线性拟合,但它没有正确。我需要它扩展到三个衬里适合。 如何使用Python确定数据的三个最佳线性拟合?
MWE
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.colors as colors
import matplotlib.cm as mplcm
import itertools
from scipy import optimize
def piecewise_linear(x, x0, y0, k1, k2):
return np.piecewise(x, [x < x0], [lambda x:k1*x + y0-k1*x0, lambda x:k2*x + y0-k2*x0])
with open('./three_piecewise_linear.dat', "r") as data:
while True:
line = data.readline()
if not line.startswith('#'):
break
data_header = [i for i in line.strip().split('\t') if i]
_data_ = np.genfromtxt(data, names = data_header, dtype = None, delimiter = '\t')
_data_.dtype.names = [j.replace('_', ' ') for j in _data_.dtype.names]
data = np.array(_data_.tolist())
n_rf = data.shape[1] - 2
xd = np.linspace(1, 1.5, 100)
fit_data = np.empty(shape = (100, n_rf))
for i in range(n_rf):
p , e = optimize.curve_fit(piecewise_linear, data[:, 1], np.log(data[:, i + 2]))
fit_data[:, i] = piecewise_linear(xd, *p)