【问题标题】:How should I generate outliers randomly?我应该如何随机生成异常值?
【发布时间】:2019-03-26 07:27:42
【问题描述】:

我正在生成一个随机数据集。我的数据集是连续的,并且有上限和下限。在某些随机点,我希望我的数据集的异常值高于和低于限值。这是我的代码。

generated_data = (12) * np.random.rand(100) + 630
outlier_data = (12) * np.random.rand(20) + (*HERE'S THE PROBLEM)
merged_data = np.concatenate((generated_data, outlier_data))

在这之后,我想我会对merged_data 进行洗牌。但我不知道如何正确生成异常值。

【问题讨论】:

  • 那么你的限制是什么,实际的问题是什么?
  • 你的意思是有一些低于 630 和高于 1830 的值吗?
  • 建议你查看pyod.utils.data函数get_outliers_inliers中的PyOD包
  • 对不起,如果我的问题不清楚。我的数据集的中位数为 630,上限和下限为 12。我希望随机有超过 642 或低于 618 的异常值。
  • 您可以在 numpy 中使用具有给定均值和中位数的均匀或正态分布函数生成。它还会产生异常值

标签: python numpy


【解决方案1】:

只需独立生成三部分数据:首先是非异常值,然后是上下异常值,将它们合并在一起,最后将它们打乱:

def generate(median=630, err=12, outlier_err=100, size=80, outlier_size=10):
    errs = err * np.random.rand(size) * np.random.choice((-1, 1), size)
    data = median + errs

    lower_errs = outlier_err * np.random.rand(outlier_size)
    lower_outliers = median - err - lower_errs

    upper_errs = outlier_err * np.random.rand(outlier_size)
    upper_outliers = median + err + upper_errs

    data = np.concatenate((data, lower_outliers, upper_outliers))
    np.random.shuffle(data)

    return data

你会得到这样的东西:

>>> data = generate()
>>> data.shape
(100,)
>>> data.min()
518.1635764484727
>>> data.max()
729.9467630423616
>>> np.median(data)
629.9427184256936

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2017-06-05
    相关资源
    最近更新 更多