我有6个与此类似的数据集(不是我的实际数据): "Raw" data - sorry, not enough rep to post images...
对于每个数据集(i)我正在尝试绘制y_i/a_i
与a_i*x_i
的关系图,以使我拥有类似于此图的内容(请注意压缩和重叠的外观):
Shifted data
编辑:如果不清楚,y_i/a_i
与a_i*x_i
是我无法更改的地方。
我想优化向量a
,以便最大化数据集之间的重叠。
This post引导我走上了使用scipy.spatial.distance.cdist的方法,以最小化点之间的距离,从而使重叠最大化。我认为pdist对于所有数据集的重叠都更好,然后尝试使用scipy.optimize.minimize为a
设置值。
每当我尝试设置界限时,我都会得到b'ABNORMAL_TERMINATION_IN_LNSRCH
,似乎是来自gradient error的界限,但这开始让我感到头疼。
下面的代码是关于我所提出的内容,已尽我所能进行了清理。
def data_shift(x0, a, df):
"""
x0: our initial guess of values for a_i
a: a DataFrame with two columns: Dataset, a_i
df: a DataFrame with 3 columns: Dataset, x, and y
"""
#overwrite old values of a[a_i]
a['a_i']=x0
# match each data set with it's shifting variable
# and combine into one DataFrame
dfs=df.merge(a, on='Dataset')
# create new columns of shifted data based on a
dfs['ax'] = dfs['x']*dfs['a_i']
dfs['ya'] = dfs['y']/dfs['a_i']
return np.mean(pdist(dfs.loc[:, ['ax', 'ya']]))
# set bounds for values of a_i
# a_i must be >0, but generally it is <5 too
b=(0,5)
bnds=(b,b,b,b,b,b) #one b for each a_i
sol = minimize(data_shift, x0=[1,1,1,1,1,1], args=(a, df), bounds=bnds)
sol
现在它只是给我这个:
fun: nan
hess_inv: <6x6 LbfgsInvHessProduct with dtype=float64>
jac: array([33751.64233148, 66479.62145507, 75388.05366494, 48267.75984839,
15358.34744573, 39810.20417996])
message: b'ABNORMAL_TERMINATION_IN_LNSRCH'
nfev: 147
nit: 0
status: 2
success: False
x: array([1., 1., 1., 1., 1., 1.])
欢迎所有建议和替代方案,因为此时我有点不知所措。 谢谢!