如何使用Python将有序的1D数据粗化为不规则的bin

时间:2019-03-13 01:45:34

标签: python scipy binning

我有一个高频的有序一维数据集,它与关于深度的属性的观察有关,包括连续的浮点值观察与单调增加的深度

我想找到一种方法来将此数据粗化为用户定义数量的连续箱(或区域),每个箱由一个均值和下限深度(定义的上限深度)来描述在其上方区域的末端)。划分区域的标准应为k均值,例如-在指定区域数量的范围内,每个区域内的属性差异最小,相邻区域之间的最大差异。

例如,如果我有一个小的高频数据集,如下所示;

depth = [2920.530612, 2920.653061, 2920.734694, 2920.857143, 2920.938776, 2921.102041, 2921.22449, 2921.346939, 2921.469388, 2921.510204, 2921.55, 2921.632653, 2921.795918, 2922, 2922.081633, 2922.122449, 2922.244898, 2922.326531, 2922.489796, 2922.612245, 2922.857143, 2922.979592, 2923.020408, 2923.142857, 2923.265306]
value = [0.0098299, 0.009827939, 0.009826632, 1004.042327, 3696.000306, 3943.831644, 3038.254723, 3693.543377, 3692.806616, 50.04989348, 15.0127, 2665.2111, 3690.842641, 3238.749497, 429.4979635, 18.81228993, 1800.889643, 2662.199897, 3454.082382, 3934.140146, 3030.184014, 0.556587319, 8.593768956, 11.90163067, 26.01012696]

我要请求分成7个区域,它将返回类似以下内容的内容;

depth_7zone =[2920.530612, 2920.857143, 2920.857143, 2921.510204, 2921.510204, 2921.632653, 2921.632653, 2922.081633, 2922.081633, 2922.244898, 2922.244898, 2922.979592, 2922.979592, 2923.265306]
value_7zone = [0.009828157, 0.009828157, 3178.079832, 3178.079832, 32.53129674, 32.53129674, 3198.267746, 3198.267746, 224.1551267, 224.1551267, 2976.299216, 2976.299216, 11.76552848, 11.76552848]

可以显示为(蓝色=原始数据,红色=分为7个区域的数据);

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()

plt.plot(value, depth, '-o')
plt.plot(value_7zone, depth_7zone, '-', color='red')
plt.gca().invert_yaxis()
plt.xlabel('Values')
plt.ylabel('Depth')
plt.show()

Original data with zonated (in red) data

我尝试了标准的k均值聚类,但它似乎不适合此有序的1D问题。我当时在考虑可能用于数字信号处理的方法,但是我发现所有离散化为恒定的bin大小,甚至用于图像压缩,但这可能会过大并可能期望2D数据

有人可以建议进一步探索的途径吗? (我对Python还是很陌生,所以请提前道歉)

0 个答案:

没有答案