在火炬中聚类

时间:2015-03-20 10:51:36

标签: lua machine-learning cluster-analysis torch

我正在尝试学习用于机器学习的Torch库。

我知道Torch的焦点是神经网络,但仅仅是为了它,我试图在它上运行kmeans。如果没有,Torch实现快速连续存储,应该类似于numpy数组,Torch cheatsheet引用unsup库进行无监督学习,为什么不呢?

我已经将a benchmark用于K-means实现。尽管所有实现都是故意使用未经优化的算法(README解释了原因),但LuaJIT能够在611ms内聚集100000个点。在Nim(不在存储库中)的优化(或者我应该说,不是故意放慢速度)实现在68毫秒内运行,所以我期待介于两者之间。

不幸的是,情况要糟糕得多,所以我怀疑我做错了什么。我写的是

require 'io'
cjson = require 'cjson'
require 'torch'
require 'unsup'

content = io.open("points.json"):read("*a")
data = cjson.decode(content)
points = torch.Tensor(data)
timer = torch.Timer()
centroids, counts = unsup.kmeans(points, 10, 15)

print(string.format('Time required: %f s', timer:time().real))

,运行时间约为6秒!

任何人都可以检查我在使用Torch / unsup时是否做错了吗?

如果有人想尝试,文件points.json位于上述存储库

1 个答案:

答案 0 :(得分:1)

  

任何人都可以检查我在使用Torch / unsup时是否做错了吗?

一切听起来都是正确的(注意:建议使用local个变量):

  • data是一个二维表,您使用相应的Torch constructor
  • points是具有nb的二维张量。 rows = nb。点和nb。 cols = points dimension(这里2)。这就是unsup.kmeans expects as input

您可以做的是更改批量大小(第四个参数)。它可能会影响性能。您还可以使用将输出每次迭代的平均时间的详细模式:

-- batch size = 5000, no callback, verbose mode
centroids, counts = unsup.kmeans(points, 10, 15, 5000, nil, true)