支持Java的Vector Machine?
artificial-intelligence
java
machine-learning
svm
6
0

我想用Java编写一个“智能监视器”,它在检测到即将到来的性能问题时会发出警报。我的Java应用正在将结构化格式的数据写入日志文件:

<datetime> | <java-method> | <seconds-to-execute>

因此,例如,如果我有一个Widget#doSomething(String)方法要花费812ms的时间执行,它将记录为:

2013-03-24 11:39:21 | Widget#doSomething(String) | 812

随着性能开始下降(例如,在大型采集期间,高峰负载期间,或者如果系统正缓慢地进行爬网),方法的执行时间开始变慢。因此最右边的列开始显示巨大的数字(有时需要20-40秒才能执行一个方法)。

在大学里(一次机器学习练习),我写了我的教授所说的线性二分法 ,它可以获取简单的测试数据(一个人的身高,体重和性别),并“学习”如何根据他们的性别将其分类为男性还是女性身高体重。然后,一旦获得所有训练数据,我们就会向其提供新数据,以查看其确定性别的准确性。

认为 线性二分法的多元版本称为支持向量机 (SVM) 。如果我错了,请进行澄清,然后将问题标题更改为更合适的名称。 无论如何 ,我需要此应用执行以下操作:

  • 在“测试模式”下运行,在该模式下,我从我的主Java应用程序(希望监视的应用程序)中获取结构化日志文件,并获取每个日志条目(如上所示)并将其用于测试数据
    • java-methodseconds-to-execute列作为输入/测试数据很重要;我不在乎约会时间
  • 在“监视模式”下运行,在该模式下,它将主动从日志文件中读取新的日志数据,并使用类似的“机器学习”技术来确定性能下降是否迫在眉睫

需要特别注意的是, seconds-to-execute并不是此处唯一重要的因素,因为我已经看到某些方法在性能出色期间的时间安排很糟糕,而在服务器看起来像这样的情况下其他方法确实花费了很多时间它即将死去并推开雏菊。因此,显然某些方法对性能“加权” /比其他方法更重要。

我的问题

  • 搜寻“线性二分法”或“支持向量机”会发现一些非常可怕的,高度学术性的,超大脑的白皮书,我只是没有精神能量(也没有时间)要消耗,除非它们确实是我唯一的选项;因此,我想问一下这些东西是否有外行介绍,或者有很好的网站/文章/教程来用Java构建这样的系统
  • 是否有任何可靠/稳定的开源Java库?我只能找到jlibsvmsvmlearn但前者看起来处于纯beta状态,而后者似乎仅支持二进制决策(例如我的旧线性二分频器)。我知道这里有Mahout,但是它位于Hadoop之上,而且我认为我没有足够的数据来保证建立自己的Hadoop集群所需的时间和精力。

提前致谢!

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

Weka是Java中流行的机器学习/数据挖掘程序包。本书http://guidetodatamining.com/可能会有用。它并没有真正解决SVM的问题,但是它确实具有良好的分类算法,并且当然一点也不神秘。

收藏
评论

如果您对使用支持向量机感兴趣,那么有一个针对初学者的指南,您可能会发现有用的指南( http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf

该指南来自libsvm,后者是一个非常成熟的支持向量机库( http://www.csie.ntu.edu.tw/~cjlin/libsvm/ ),并且确实具有针对Java的绑定( http: //www.csie.ntu.edu.tw/~cjlin/libsvm/#java

收藏
评论

您描述的“智能监视器”完全是时间序列分类。

分类算法很多。它们基本上都采用一个矩阵,其中的行是观察值,列是以某种方式描述观察值的“特征”,以及长度为0或1的长度行的标签矢量。在您的问题中,观察值可能是一分钟的样本,则在遇到性能问题的时间段内,标签向量的值为1,否则为0。

该定义中隐含了需要对数据进行重新采样(必要时使用模式/中位数/平均值),以使每个观察值均被均匀定义,例如秒,分钟或小时。

生成特征是至关重要的部分。我可能会从2个功能开始,即观测 x_i和x_i-1之间的原始值和(一次) 差值 。我们将这些延迟定义为2。从技术上讲,这4个功能均已实现。每个功能都无法展望未来。对于每个观察,每个特征都必须代表相同的事物。

例如,考虑长度为10的时间序列:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

如果我们想使用过去两个间隔的滞后来生成一组要素,则时间序列的前两个元素被视为老化样本。我们不能使用与它们相关的观察结果来训练算法。

8行2列的原始值

[[ 1.,  0.]
 [ 2.,  1.],
 [ 3.,  2.],
 [ 4.,  3.],
 [ 5.,  4.],
 [ 6.,  5.],
 [ 7.,  6.],
 [ 8.,  7.]]

差值

[[ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.]])

这些将列堆叠。您可以探索许多其他功能。 滚动平均将是我的下一个选择。

如果您想在将来进行进一步的预测,那么您的训练数据应该与标签向量相距较远。

如果性能不令人满意,请尝试通过在更大的窗口上选择滚动平均值来添加更多功能,或者将来再添加更多功能。改善时序算法性能的一个聪明技巧是包括前一个时间间隔的预测值。

使分类器适合数据的某些早期部分,然后观察其在数据后期的准确性。您可以使用许多分类指标。如果您选择使用输出概率而不是硬1/0的分类器,那么您的选择甚至会扩大。 (分类器的用法也是如此。)

精度和召回率是分类器的直观性能指标。

训练数据的前半部分(早期),然后测试后半部分(以后)。

就算法而言,我将研究逻辑回归。如果性能不令人满意,并且您已经用尽了特征提取选项,我只会在别处查找。

Mallet似乎是完成此任务的良好库。 请参阅此文档。

我最近发现了JSAT ,它看起来很有希望。

有更多特定的时间序列分类方法,这些方法明确考虑了观测值和标签的顺序性质。这是分类对时间序列的通用调整。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号