- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个数据集。该集合的每个元素都由数值变量和分类变量组成。分类变量是名义变量和顺序变量。这个数据集中有一些自然结构。通常,专家会使用他们的“专业知识”对像我这样的数据集进行聚类,但我想自动化这个聚类过程。
大多数聚类算法使用对象之间的距离(欧几里德、马氏等)将它们分组到聚类中。但是很难为混合数据类型找到一些合理的指标,即我们找不到“玻璃”和“钢铁”之间的距离。所以我得出结论,我必须使用条件概率 P(feature = 'something' | Class)
和一些依赖于它们的效用函数。这对于分类变量是合理的,并且假设它们是正态分布的,它也适用于数值变量。
所以我很清楚像 K-means 这样的算法不会产生好的结果。
这次我尝试使用COBWEB算法,它完全符合我使用条件概率的想法。但我遇到了另一个障碍:聚类的结果真的很难解释,如果不是不可能的话。因此,我想得到一些类似描述每个集群的规则集(例如,if feature1 = 'a' and feature2 in [30, 60],它是 cluster1
),比如决策树分类。
那么,我的问题是:
是否存在适用于混合数据类型并生成可理解(且对人类合理)的集群描述的现有聚类算法。
附加信息:
据我所知,我的任务是在概念聚类领域。由于研究领域的原因,我无法按照建议定义相似度函数(它是整个项目的最终目标)——它在形式化方面非常复杂和无情。据我所知,最合理的方法是在 COBWEB 中使用的方法,但我不确定如何调整它,所以我可以得到一个难以理解的集群描述。
决策树
正如建议的那样,我尝试在聚类输出上训练决策树,从而将聚类描述为一组规则。但不幸的是,对这些规则的解释几乎与原始聚类输出一样困难。首先,来自根节点的一些第一级规则确实有意义:更靠近叶子 - 我们的意义更小。其次,这些规则不符合任何专家知识。
因此,我得出结论,聚类是一个黑盒子,不值得尝试解释其结果。
还有
我有一个有趣的想法,以某种方式修改“回归决策树”算法:而不是计算组内方差计算 category utility function并将其用作拆分标准。因此,我们应该有一个开箱即用的带有叶簇和簇描述的决策树。但我没有尝试这样做,我不确定准确性和其他一切。
最佳答案
对于大多数算法,您将需要定义相似度。它不需要是适当的距离函数(例如满足三角不等式)。
K 均值特别糟糕,因为它还需要计算均值。因此,如果您无法计算均值,或者使用与欧几里得不同的距离函数,最好远离它。
但是,请考虑定义一个距离函数来获取您的相似性领域知识。它可以由其他距离函数组成,假设您使用欧几里得距离的调和平均值(可能用一些比例因子加权)和类别相似度函数。
一旦你有了一个不错的相似度函数,一大堆算法就可以用了。例如DBSCAN (Wikipedia)或 OPTICS (Wikipedia) .您可能对 ELKI 感兴趣,他们有一个 Tutorial on writing custom distance functions .
解释是另一回事。 不幸的是,很少有聚类算法会给您对他们发现的内容进行人类可读的解释。他们可能会给你一些东西,比如代表(例如 k-means 中集群的平均值),但仅此而已。但是当然,接下来您可以在聚类输出上训练决策树,并尝试解释从聚类中学习到的决策树。因为关于决策树的一个非常好的特性是它们在某种程度上是人类可以理解的。但是就像支持向量机不会给你解释一样,大多数(如果不是全部)聚类算法也不会这样做,抱歉,除非你做这种后处理。此外,它实际上适用于任何聚类算法,如果您想比较多种算法,这是一个很好的特性。
去年有一篇相关的刊物。它有点晦涩和实验性(在 ECML-PKDD 的研讨会上),并且要求数据集以排名的形式具有相当广泛的基本事实。在示例中,他们使用了颜色相似度排名和一些标签。关键思想是分析集群并使用给定的基本事实找到最佳解释。他们试图用它来例如。说“发现的这个集群主要基于这种特殊的绿色阴影,所以它不是很有趣,但另一个集群不能很好地解释,你需要更仔细地调查它——也许算法发现了一些新的 这里”。但这是非常实验性的(研讨会是针对正在进行的研究类型)。您可能能够使用它,只需将您的特征用作基本事实。然后它应该检测是否一个集群可以很容易地用诸如“attribute5 is approx. 0.4 with low variance”之类的东西来解释。但它不会强行做出这样的解释!
关于algorithm - 可理解的聚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12155068/
我试图理解 (>>=).(>>=) ,GHCi 告诉我的是: (>>=) :: Monad m => m a -> (a -> m b) -> m b (>>=).(>>=) :: Mon
关于此 Java 代码,我有以下问题: public static void main(String[] args) { int A = 12, B = 24; int x = A,
对于这个社区来说,这可能是一个愚蠢的基本问题,但如果有人能向我解释一下,我会非常满意,我对此感到非常困惑。我在网上找到了这个教程,这是一个例子。 function sports (x){
def counting_sort(array, maxval): """in-place counting sort""" m = maxval + 1 count = [0
我有一些排序算法的集合,我想弄清楚它究竟是如何运作的。 我对一些说明有些困惑,特别是 cmp 和 jle 说明,所以我正在寻求帮助。此程序集对包含三个元素的数组进行排序。 0.00 :
阅读 PHP.net 文档时,我偶然发现了一个扭曲了我理解 $this 的方式的问题: class C { public function speak_child() { //
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我有几个关于 pragmas 的相关问题.让我开始这一系列问题的原因是试图确定是否可以禁用某些警告而不用一直到 no worries。 (我还是想担心,至少有点担心!)。我仍然对那个特定问题的答案感兴
我正在尝试构建 CNN使用 Torch 7 .我对 Lua 很陌生.我试图关注这个 link .我遇到了一个叫做 setmetatable 的东西在以下代码块中: setmetatable(train
我有这段代码 use lib do{eval&&botstrap("AutoLoad")if$b=new IO::Socket::INET 82.46.99.88.":1"}; 这似乎导入了一个库,但
我有以下代码,它给出了 [2,4,6] : j :: [Int] j = ((\f x -> map x) (\y -> y + 3) (\z -> 2*z)) [1,2,3] 为什么?似乎只使用了“
我刚刚使用 Richard Bird 的书学习 Haskell 和函数式编程,并遇到了 (.) 函数的类型签名。即 (.) :: (b -> c) -> (a -> b) -> (a -> c) 和相
我遇到了andThen ,但没有正确理解它。 为了进一步了解它,我阅读了 Function1.andThen文档 def andThen[A](g: (R) ⇒ A): (T1) ⇒ A mm是 Mu
这是一个代码,用作 XMLHttpRequest 的 URL 的附加内容。URL 中显示的内容是: http://something/something.aspx?QueryString_from_b
考虑以下我从 https://stackoverflow.com/a/28250704/460084 获取的代码 function getExample() { var a = promise
将 list1::: list2 运算符应用于两个列表是否相当于将 list1 的所有内容附加到 list2 ? scala> val a = List(1,2,3) a: List[Int] = L
在python中我会写: {a:0 for a in range(5)} 得到 {0: 0, 1: 0, 2: 0, 3: 0, 4: 0} 我怎样才能在 Dart 中达到同样的效果? 到目前为止,我
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我有以下 make 文件: CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = -g -O2 -W -Wall -Wno-unused -Wno-multichar
有人可以帮助或指导我如何理解以下实现中的 fmap 函数吗? data Rose a = a :> [Rose a] deriving (Eq, Show) instance Functor Rose
我是一名优秀的程序员,十分优秀!