【问题标题】:Determine if a set of data is from a linear or logarithmic function?确定一组数据是来自线性函数还是对数函数?
【发布时间】:2011-11-03 02:32:59
【问题描述】:

我有一组数据点,我很好奇这些数据是代表线性函数还是对数函数。

数据集是二维的。

假设一组理想的数据点遵循函数 f(x) = x。如果我绘制数据点,我将能够判断它是线性的。

同样,如果数据点遵循函数 f(x) = log(x),我将能够直观地看出它是对数的。

另一方面,让程序确定一组数据是线性数据还是对数数据是不平凡的。我该如何处理?

【问题讨论】:

  • 线性或 log n 与什么有关?
  • 数据集是二维的吗?
  • 这和Java有什么关系?这是一道纯算法题,不是编程题。
  • 不确定你所说的“一组数据点”是“线性或对数 n”是什么意思 - 你能详细说明一下吗?

标签: algorithm math statistics data-analysis


【解决方案1】:

一种选择是对数据集执行linear regression 以获得最佳拟合线。如果数据是线性的,你会得到一个很好的拟合,mean squared error 应该很低。否则,你会得到一个很好的配合和一个合理的错误。

或者,您可以考虑通过转换每个点 (x0, x1, ..., xn , y) 到 (x0, x1, ..., xn, ey)。如果数据是线性的,现在它将是指数的,如果数据是对数的,现在它将是线性的。现在运行线性回归并得到均方误差,对数数据的误差很小,而线性数据的误差大得惊人,因为指数函数爆炸得非常快。

要实际实现回归,一种选择是使用least-squares regression。除了模型之外,这还有一个额外的好处,即为您提供一个相关系数,它也可以用来区分两个数据集。

因为您询问了如何在 Java 中执行此操作,所以快速的 Google 搜索出现了 this Java code 以进行线性回归。但是,您可能更适合像 Matlab 这样专门为执行此类查询而优化的语言。例如,在 Matlab 中,您可以在一行代码中编写此回归

linearFunction = inputs / outputs

希望这会有所帮助!

【讨论】:

  • @SeriousTyro- 是的,没错。如果这些点真的是从线性函数中绘制的(也就是说,根本没有误差),则 MSE 将为零。
  • 我喜欢这个!如果我理解正确,线性回归给出了最佳拟合线。如果它是线性的,则 MSE 将很低。然后我可以使用程序的 MSE 来确定它是否是线性的。同样,如果我使用以 2 为底的对数,我将每个点转换为 2^x,那么数据集将是线性的,线性回归会给我一个低 MSE。非常好!
  • @SeriousTyro- 是的,差不多就是这样。 :-) 虽然如果你知道你正在处理或者一个线性或对数函数,那么你应该首先对所有东西取幂以放大线性函数的 MSE。很高兴为您提供帮助!
  • @templatetypedef- 也可能有一个常量函数,但现在这是一件小事。我不太明白“对所有事物取幂以放大 MSE”。因此,如果我对我的数据求幂,无论它是什么类型的函数,MSE 都会增加。这样做本质上“放大”了 MSE,因此更容易对函数类型进行阈值处理?我担心为什么要对数据求幂而不是简单地缩放 MSE。
  • @SeriousTyro- 如果您有线性分布的数据,则绘图的 MSE 会很小。如果您有对数分布的数据,那么由于函数 log x 增长非常缓慢,如果您只有大数的 log 值,它可能看起来是一个常数。如果你对所有东西取幂,那么线性函数将是非常非线性的(线性近似会很糟糕),而对数函数将有一个很好的拟合。换句话说,如果你想找出哪个是哪个,求幂会让你更容易发现日志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 2012-06-02
  • 2014-05-25
  • 1970-01-01
相关资源
最近更新 更多