如何使用Python确定数据的三个最佳线性拟合?

时间:2016-06-04 13:11:11

标签: python numpy scipy linear-regression piecewise

我有图中所示形式的data。数据的自然对数总是有三个不同的线性范围,但范围并不总是相同,它随数据而变化,但肯定会有三个区域可以进行三种不同的线性拟合。

我试图确定最好的三个线性拟合它的自然对数标记为I,II和III。该图显示了y数据的自然对数。这必须适用于至少数千个数据集。代码自动检测图中所示三个区域的最佳线性拟合。

enter image description here

我试图使用这样的代码来完成它,它尝试使用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)

0 个答案:

没有答案