我正在尝试学习用于机器学习的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
位于上述存储库
答案 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)