Python 如何将多条曲线拟合到单个数据散点图?
我有来自不同曲线的数据,希望分别拟合它们。但是,数据被混合到单个数组中,因此首先我认为需要一种分离数据的方法 我知道每个单独的曲线都在A/x+B族下。到目前为止,我用手剪切每个曲线并进行曲线拟合,但我想自动化此过程,让计算机将这些曲线分离并进行拟合。我试图使用机器学习,但不知道从哪里开始,使用什么软件包。我使用Python,但也可以使用C++,其实我希望把它移植到C++端。你认为我应该从哪里开始,使用无监督机器学习值得吗,还是有更好的方法来分离数据 预期曲线:Python 如何将多条曲线拟合到单个数据散点图?,python,c++,machine-learning,curve-fitting,Python,C++,Machine Learning,Curve Fitting,我有来自不同曲线的数据,希望分别拟合它们。但是,数据被混合到单个数组中,因此首先我认为需要一种分离数据的方法 我知道每个单独的曲线都在A/x+B族下。到目前为止,我用手剪切每个曲线并进行曲线拟合,但我想自动化此过程,让计算机将这些曲线分离并进行拟合。我试图使用机器学习,但不知道从哪里开始,使用什么软件包。我使用Python,但也可以使用C++,其实我希望把它移植到C++端。你认为我应该从哪里开始,使用无监督机器学习值得吗,还是有更好的方法来分离数据 预期曲线: 嗯,你确实有一个有趣的问题 我
嗯,你确实有一个有趣的问题 我看到有些曲线的Y轴值比其他曲线大得多。我只需要取Y轴最大的第一个N值,然后将它们拟合到指数衰减曲线(或者你提到的其他曲线)。然后,您可以简单地选取最适合该曲线的点,然后不考虑其他点 除了 这是一种可怕的推断数据的方法。这样做,您就可以挑选所需的数据。这是伪造信息,非常糟糕 如果无法使用外部信息将所有点隔离到单独的曲线中,则最好创建一条所有点都适合的曲线 但是 我们确实知道一些信息:给定一个输入,一个有效函数必须只有一个输出 如果X轴是离散的,这意味着您可以创建给定输入的输出查找表。这允许您计算与特定X值(可以是时间单位)关联的曲线数。换句话说,您必须有外部信息在本地分离点。然后可以按增加的Y值对点重新排序,现在可以在离散点中定义单独的曲线 基本上,这在一般意义上是一个无法解决的问题,但是在您的特定应用程序中,可能会有额外的规则来进一步定义域和范围,以便您可以进行数据过滤 还有一件事。。。 我在做这些陈述时假设(X,Y)值是浮点数,经过一些数学运算后无法保持精度 如果您使用的是以下内容,则可以在小数点中保留足够的信息,以便拟合函数可以在不进行额外过滤的情况下区分点 这种情况比任何事情都更有希望,因为采用新的数字表示以获得更高的精度来隔离采样点充其量只是一种延伸 为了完整起见,这里有一些数学库可能会对您有所帮助
希望我已经给了你足够的信息让你解决你的问题 我从绘图中提取数据进行分析。下面是加载、分离、拟合和绘制三个数据集的示例代码。将单独的数据文件追加到单个文本文件中时,该方法有效 想法: 创建N个简单、易于计算、足够精确(用于聚类)的近似值。然后将每个数据点“分类”到最接近的近似值。 这是这样做的:
- 近似值是使用以下两个方程式得出的解析近似值:
- 为了得到这两个点,我假设(1)第一个点(根据x轴)在不同的实际曲线之间均匀分布。(2)每条实曲线的2个第一点小于或大于每条实曲线的2个第一点。因此,对它们进行排序并划分为N组将成功地对前*2*N*个点进行聚类如果这些假设为假您仍然可以手动分类每条真实曲线的前两个点,其余点将自动分类(这实际上是我实施的第一种方法)
- 然后将其余的点聚集到每个点的最近近似值。意思最接近,误差最小
import numpy as np
import matplotlib.pyplot as plt
# You should probably edit this variable
NUM_OF_CURVES = 4
# <data> should be a 1-D array containing the Y values of the series
# <x_of_data> should be a 1-D array containing the corresponding X values of the series
data, x_of_data = np.loadtxt('...')
# clustering of first 2*num_of_curves points
# I started at NUM_OF_CURVES instead of 0 because my xs started at 0.
# The range (0:NUM_OF_CURVES*2) will probably be better for you.
raw_data = data[NUM_OF_CURVES:NUM_OF_CURVES*3]
raw_xs = x_of_data[NUM_OF_CURVES:NUM_OF_CURVES*3]
sort_ind = np.argsort(raw_data)
Y = raw_data[sort_ind].reshape(NUM_OF_CURVES,-1).T
X = raw_xs[sort_ind].reshape(NUM_OF_CURVES,-1).T
# approximation of A and B for each curve
A = ((Y[0]*Y[1])*(X[0]-X[1]))/(Y[1]-Y[0])
B = (A / Y[0]) - X[0]
# creating approximating curves
f = []
for i in range(NUM_OF_CURVES):
f.append(A[i]/(x_of_data+B[i]))
curves = np.vstack(f)
# clustering the points to the approximating curves
raw_clusters = [[] for _ in range(NUM_OF_CURVES)]
for i in range(len(data)):
raw_clusters[np.abs(curves[:,i]-data[i]).argmin()].append((x_of_data[i],data[i]))
# changing the clusters to np.arrays of the shape (2,-1)
# where row 0 contains the X coordinates and row 1 the Y coordinates
clusters = []
for i in range(len(raw_clusters)):
clusters.append(np.array(list(zip(*raw_clusters[i]))))
将numpy导入为np
将matplotlib.pyplot作为plt导入
#您可能应该编辑此变量
曲线的数量=4
#应为包含序列Y值的一维数组
#应该是一个一维数组,包含序列的相应X值
数据,x_of_data=np.loadtxt(“…”)
#前2*num_曲线点的聚类
#我从曲线的NUM_开始,而不是0,因为我的X从0开始。
#范围(0:NUM_的_曲线*2)可能更适合您。
原始数据=数据[曲线数:曲线数*3]
原始_xs=x_的_数据[NUM_的_曲线:NUM_的_曲线*3]
sort\u ind=np.argsort(原始数据)
Y=原始数据[sort\u ind]。重塑(曲线数,-1)。T
X=raw_xs[sort_ind]。重塑(曲线数,-1)。T
#每条曲线A和B的近似值
A=((Y[0]*Y[1])*(X[0]-X[1])/(Y[1]-Y[0]))
B=(A/Y[0])-X[0]
#创建近似曲线
f=[]
对于范围内的i(曲线数):
f、 附加(A[i]/(x_/u数据+B[i]))
曲线=np.vstack(f)
#将点聚类到近似曲线
原始_簇=[]用于范围内的u(曲线的数量)]
对于范围内的i(len(数据)):
原始_簇[np.abs(曲线[:,i]-数据[i]).argmin()]追加((x_的_数据[i],数据[i]))
#将簇更改为形状(2,-1)的np.Array
#其中第0行包含X c
import numpy as np
import matplotlib.pyplot as plt
# You should probably edit this variable
NUM_OF_CURVES = 4
# <data> should be a 1-D array containing the Y values of the series
# <x_of_data> should be a 1-D array containing the corresponding X values of the series
data, x_of_data = np.loadtxt('...')
# clustering of first 2*num_of_curves points
# I started at NUM_OF_CURVES instead of 0 because my xs started at 0.
# The range (0:NUM_OF_CURVES*2) will probably be better for you.
raw_data = data[NUM_OF_CURVES:NUM_OF_CURVES*3]
raw_xs = x_of_data[NUM_OF_CURVES:NUM_OF_CURVES*3]
sort_ind = np.argsort(raw_data)
Y = raw_data[sort_ind].reshape(NUM_OF_CURVES,-1).T
X = raw_xs[sort_ind].reshape(NUM_OF_CURVES,-1).T
# approximation of A and B for each curve
A = ((Y[0]*Y[1])*(X[0]-X[1]))/(Y[1]-Y[0])
B = (A / Y[0]) - X[0]
# creating approximating curves
f = []
for i in range(NUM_OF_CURVES):
f.append(A[i]/(x_of_data+B[i]))
curves = np.vstack(f)
# clustering the points to the approximating curves
raw_clusters = [[] for _ in range(NUM_OF_CURVES)]
for i in range(len(data)):
raw_clusters[np.abs(curves[:,i]-data[i]).argmin()].append((x_of_data[i],data[i]))
# changing the clusters to np.arrays of the shape (2,-1)
# where row 0 contains the X coordinates and row 1 the Y coordinates
clusters = []
for i in range(len(raw_clusters)):
clusters.append(np.array(list(zip(*raw_clusters[i]))))