我需要一些数字数据集来创建概念层次结构。现在,我一直在通过观察数据(和相应的线图)手动完成此操作。基于我的直觉,我创建了一些可接受的层次结构。
这似乎是一项可以自动化的任务。 是否有人知道是否有算法为数值数据生成概念层次结构?
举个例子,我有以下数据集:
Bangladesh 521
Brazil 8295
Burma 446
China 3259
Congo 2952
Egypt 2162
Ethiopia 333
France 46037
Germany 44729
India 1017
Indonesia 2239
Iran 4600
Italy 38996
Japan 38457
Mexico 10200
Nigeria 1401
Pakistan 1022
Philippines 1845
Russia 11807
South Africa 5685
Thailand 4116
Turkey 10479
UK 43734
US 47440
Vietnam 1042
alt text http://i40.tinypic.com/fd7xxu.jpg
我为其创建了以下层次结构:
答案 0 :(得分:5)
也许您需要clustering算法?
从链接引用:
聚类分析或聚类是 分配一组观察 到子集(称为集群),以便 在同一群集中的观察是 在某种意义上类似。聚类是一个 无监督学习的方法,和 统计数据的常用技术 在许多领域使用的分析
答案 1 :(得分:4)
Jenks Natural Breaks是一种非常有效的单维聚类方案:http://www.spatialanalysisonline.com/OUTPUT/html/Univariateclassificationschemes.html#_Ref116892931
正如评论所指出的,这与k-means非常相似。但是,我发现它更容易实现,特别是在Borden Dent的制图中发现的变化:http://www.amazon.com/Cartography-Thematic-Borden-D-Dent/dp/0697384950
答案 2 :(得分:3)
我认为你正在寻找类似于data discretization的东西,这在AI中很常见,它将连续数据(或具有如此大量类的离散数据转换为不实用的)转换为离散类。
我知道Weka使用Fayyad&伊朗的MDL方法以及Kononeko的MDL方法,我会看看我是否可以挖掘一些参考文献。
答案 3 :(得分:1)
这只是一维问题,因此可能存在动态编程解决方案。假设以排序顺序获取点然后进行n-1次切割以生成n个簇是有意义的。假设您可以为每个聚类写下惩罚函数f(),例如聚类中的方差,或者聚类中最小值和最大值之间的距离。然后,您可以最小化每个群集评估的f()的总和。从左到右一次一个点工作。在每个点上,对于1 ..#clusters - 1,找出将点到目前为止分成多个簇的最佳方法,并存储该答案的成本和最右侧分割的位置。您可以按如下方式处理点P和簇大小c:考虑P左侧的所有可能的切割。对于每个切割,添加f()在切割右侧的点组上评估(存储)成本在切割左侧的点处,簇大小c-1的最佳解决方案。一旦你按照最右边的方式工作,再次执行相同的技巧来计算群集大小c的最佳答案,并使用最右边分割的存储位置来恢复提供最佳答案的所有分割。
这实际上可能比k-means变体更昂贵,但具有保证找到全局最佳答案(对于您在这些假设下选择的f())的优势。
答案 4 :(得分:0)
答案 5 :(得分:0)
我在想。
显然你正在寻找的是干净的休息时间。因此,在开始使用复杂算法之前,您可能会想到一种差异化方法。
[1, 1.2, 4, 5, 10]
[20%, 333%, 25%, 100%]
现在,根据我们正在寻找的休息时间,这是选择它们的问题:
2 categories: [1, 1.2] + [4, 5, 10]
3 categories: [1, 1.2] + [4, 5] + [10]
我不了解你,但在我看来它确实感觉很自然,你甚至可以使用一个阈值方法,说小于x%
的变化不值得考虑削减。
例如,4 categories
似乎没有多大意义。