在数据集中找出“边缘案例”
我提前道个歉,因为我说得可能不太准确,因为我不知道我想要的数学表达式是什么。
我正在使用matplotlib来分析一个大数据集。现在我有一组x和y的点的分布。我想找出那些x值相同但y值差异最大的情况。所以如果我把它画出来,某些点会在图的上方,另一些则在下方。
那么,我该如何找到这些点(x,y)和(x,y'),使得f(x)=y和f(x)=y',并且y-y'的差值最大呢?
谢谢!
2 个回答
1
我觉得你想要的是一个方差图。首先,创建一个字典,用来存放不同的x值。然后,把每个不同的y值放到一个列表里,这个列表是和每个x值关联的。接着,计算这个列表的标准差(用np.std),我们把这个标准差叫做"s"。最后,把s和x的关系画出来。
1
我不太确定我理解得对不对,但这里有一个简单的解决方案,你可以根据自己的需要进行调整:
from collections import defaultdict
input = [(1.2,2), (1.2, 6), (1.2, -2), (2,8), (2,7), (2,18)]
indices_dict = defaultdict(lambda: list([[], []]))
for idx, val in enumerate(input):
indices_dict[val[0]][0].append(idx)
indices_dict[val[0]][1].append(val[1])
for key in indices_dict:
y_values = indices_dict[key][1]
idx_values = indices_dict[key][0]
max_idx = idx_values[y_values.index(max(y_values))]
min_idx = idx_values[y_values.index(min(y_values))]
print 'Max diff for x=%s is found between points %s and %s' %(key, input[min_idx], input[max_idx])
这个代码应该会为每一个不同的x值,打印出在y值上差异最大的点。你可以根据自己的需求来修改它。