我需要实现scikit-learn的kMeans来集群文本文档.该示例代码工作正常,因为它只是需要一些20newsgroups数据作为输入.我想使用相同的代码来集群文档列表,如下所示:
documents = ["Human machine interface for lab abc computer applications",
"A survey of user opinion of computer system response time",
"The EPS user interface management system",
"System and human system engineering testing of EPS",
"Relation of user perceived response time to error measurement",
"The generation of random binary unordered trees",
"The intersection graph of paths in trees",
"Graph minors IV Widths of trees and well quasi ordering",
"Graph minors A survey"]
Run Code Online (Sandbox Code Playgroud)
在kMeans示例代码中我需要做哪些更改才能使用此列表作为输入?(简单地说'dataset = …
可能重复:
具有相等簇大小的K均值算法变化
编辑:像casperOne指出,这个问题是重复的.无论如何,这是一个更普遍的问题,涵盖这一个:https://stats.stackexchange.com/questions/8744/clustering-procedure-where-each-cluster-has-an-equal-number-of-points
我的要求
在一个项目中,我需要将n个点(x,y)分组为相同大小的k个簇(n/k).其中x和y是双浮点数,n的范围可以是100到10000,k的范围是2到100.在算法运行之前k也是已知的.
我的实验
我开始使用http://en.wikipedia.org/wiki/K-means_clustering算法来解决这个问题,该算法非常快速地生成大致相同大小的k个簇.
但我的问题是,K-means产生大小相同的簇,我需要簇的大小完全相同(或者更精确:我需要它们的大小介于地板之间(n/k)和ceil(n/k)).
在你向我指出之前,是的,我在这里尝试了第一个答案K-means算法变化具有相同的簇大小,这听起来是个好主意.
主要思想是通过K-means对集群产生的数组进行后处理.从最大的集群到最小的集群.我们通过将额外的点移动到其他最近的集群来减少具有超过n/k成员的集群的大小.单独留下已经减少的集群.
这是我实现的伪代码:
n is the number of point
k is the number of cluster
m = n / k (the ideal cluster size)
c is the array of cluster after K-means
c' = c sorted by size in descending order
for each cluster i in c' where i = 1 to k - 1
n = size of cluster i - m (the number …Run Code Online (Sandbox Code Playgroud) 如果您在Python中使用scipy进行此分层聚类调用:
from scipy.cluster.hierarchy import linkage
# dist_matrix is long form distance matrix
linkage_matrix = linkage(squareform(dist_matrix), linkage_method)
Run Code Online (Sandbox Code Playgroud)
那么从单个点到集群分配的有效方法是什么?即一个长度的矢量,N其中N是点的数量,其中每个条目i是点的簇数i,给定在给定的聚类上由给定阈值thresh生成的聚类数?
澄清一下:群集号将是在向树应用阈值后所处的群集.在这种情况下,您将为其所在的集群的每个叶节点获得一个唯一的集群.从某种意义上说,每个点都属于一个"最具体的集群",它由您剪切树形图的阈值定义.
我知道这scipy.cluster.hierarchy.fclusterdata会给你这个集群赋值作为它的返回值,但我从自定义距离矩阵和距离度量开始,所以我不能使用fclusterdata.问题归结为:我如何计算什么fclusterdata是计算 - 集群分配?
我想定义一个新词,其中包含来自两个(或更多)不同词的计数值。例如:
Words Frequency
0 mom 250
1 2020 151
2 the 124
3 19 82
4 mother 81
... ... ...
10 London 6
11 life 6
12 something 6
Run Code Online (Sandbox Code Playgroud)
我想将母亲定义为mom + mother:
Words Frequency
0 mother 331
1 2020 151
2 the 124
3 19 82
... ... ...
9 London 6
10 life 6
11 something 6
Run Code Online (Sandbox Code Playgroud)
这是一种替代定义具有某种含义的单词组的方法(至少对于我的目的而言)。
任何建议将不胜感激。
是否有任何算法可以帮助进行分层聚类?谷歌的map-reduce只有一个k-clustering的例子.在分层聚类的情况下,我不确定如何在节点之间划分工作.我找到的其他资源是:http://issues.apache.org/jira/browse/MAHOUT-19 但是,使用哪种算法并不明显.
我在java中寻找一个轻量级的集群库.我不需要在该库中使用100个聚类算法,只需5到7个算法就可以了.
我相信,你会问:"你需要什么样的算法和目的":).我只需要在聚类的帮助下对数据进行分类.例如K表示.
PS:我知道weka,但我不想使用它,因为它不仅仅专门用于聚类.
是否有任何好的javascript库用于在网页中绘制图形?我想要一个现代的HTML5库,最好使用canvas和/或webgl.我已经 发现 一 对夫妇 的 良好的 网络 库 ,同时 研究,但他们不扩展到我的(高达2000个顶点+ 20000个边缘),像桌面软件运行图的大小Gephi可以轻松地处理或他们闪光/ silverlight-根据.所以,到目前为止,我最好的发现是基于d3.js的实现.如果他们在Seadragon风格的缩放中内置了一些基于弹簧/力的自动布局/聚类算法也会很好.
javascript canvas cluster-analysis webgl graph-visualization
更新:最后,我选择用于聚类我的大型数据集的解决方案是Anony-Mousse在下面提出的解决方案.也就是说,使用ELKI的DBSCAN实现我的聚类而不是scikit-learn.它可以从命令行运行,并通过适当的索引,在几个小时内完成此任务.使用GUI和小样本数据集来计算您想要使用的选项,然后前往城镇.值得研究.Anywho,请继续阅读我原始问题的描述和一些有趣的讨论.
我有一个包含大约250万个样本的数据集,每个样本都有35个特征(浮点值),我正在尝试聚类.我一直在尝试使用scikit-learn的DBSCAN实现,使用曼哈顿距离度量和从数据中提取的一些小随机样本估计的epsilon值.到现在为止还挺好.(这里是摘录,供参考)
db = DBSCAN(eps=40, min_samples=10, metric='cityblock').fit(mydata)
Run Code Online (Sandbox Code Playgroud)
我现在的问题是我很容易耗尽内存.(我目前正在使用16 GB RAM的机器)
我的问题是,DBSCAN是否在运行时动态计算成对距离矩阵,那是什么在吞噬我的记忆?(250万^ 2)*8字节显然是愚蠢的大,我会理解.我应该不使用这种fit()方法吗?更一般地说,有没有办法绕过这个问题,或者我一般在这里咆哮错误的树?
如果答案结果明显,请道歉.我已经困惑了几天.谢谢!
附录:如果有人能更明确地解释我fit(X)和fit_predict(X)我之间的区别,我也会感激 - 我担心我不太明白.
附录#2:可以肯定的是,我只是在一台拥有~550 GB RAM的机器上尝试了这个并且它仍然爆炸,所以我觉得DBSCAN可能会尝试制作成对距离矩阵或者我明显不想要的东西去做.我想现在最大的问题是如何阻止这种行为,或找到更适合我需要的其他方法.谢谢你在这里与我合作.
附录#3(!):我忘了附上追溯,就在这里,
Traceback (most recent call last):
File "tDBSCAN.py", line 34, in <module>
db = DBSCAN(eps=float(sys.argv[2]), min_samples=10, metric='cityblock').fit(mydata)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/base.py", line 329, in fit_predict
self.fit(X)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/cluster/dbscan_.py", line 186, in fit
**self.get_params())
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/cluster/dbscan_.py", line 69, in dbscan
D = pairwise_distances(X, metric=metric)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/metrics/pairwise.py", line 651, in pairwise_distances
return func(X, Y, **kwds)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/metrics/pairwise.py", line …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用scikit-learn来集群文本文档.总的来说,我找到了解决办法,但我遇到了具体问题.我发现的大多数例子都说明了使用scikit-learn和k-means作为聚类算法的聚类.在我的设置中采用k-means这些例子原则上是有效的.但是,k-means不适合,因为我不知道簇的数量.从我到目前为止所读到的内容 - 如果需要请在这里纠正我 - 在我的情况下,DBSCAN或MeanShift似乎更合适.scikit-learn网站提供了每个群集算法的示例.现在的问题是,对于DBSCAN和MeanShift,我得到了我无法理解的错误,更不用解决了.
我的最小代码如下:
docs = []
for item in [database]:
docs.append(item)
vectorizer = TfidfVectorizer(min_df=1)
X = vectorizer.fit_transform(docs)
X = X.todense() # <-- This line was needed to resolve the isse
db = DBSCAN(eps=0.3, min_samples=10).fit(X)
...
Run Code Online (Sandbox Code Playgroud)
(我的文档已经处理完毕,即已删除了停用词并且已应用了Porter Stemmer.)
当我运行此代码时,我在实例化DBSCAN并调用时收到以下错误fit():
...
File "/usr/local/lib/python2.7/dist-packages/sklearn/cluster/dbscan_.py", line 248, in fit
clust = dbscan(X, **self.get_params())
File "/usr/local/lib/python2.7/dist-packages/sklearn/cluster/dbscan_.py", line 86, in dbscan
n = X.shape[0]
IndexError: tuple index out of range
Run Code Online (Sandbox Code Playgroud)
单击该行dbscan_.py引发错误,我注意到以下行
...
X = np.asarray(X)
n = X.shape[0]
... …Run Code Online (Sandbox Code Playgroud) cluster-analysis machine-learning data-mining dbscan scikit-learn
我有一个纬度和经度对的数据框.
这是我的数据帧外观.
order_lat order_long
0 19.111841 72.910729
1 19.111342 72.908387
2 19.111342 72.908387
3 19.137815 72.914085
4 19.119677 72.905081
5 19.119677 72.905081
6 19.119677 72.905081
7 19.120217 72.907121
8 19.120217 72.907121
9 19.119677 72.905081
10 19.119677 72.905081
11 19.119677 72.905081
12 19.111860 72.911346
13 19.111860 72.911346
14 19.119677 72.905081
15 19.119677 72.905081
16 19.119677 72.905081
17 19.137815 72.914085
18 19.115380 72.909144
19 19.115380 72.909144
20 19.116168 72.909573
21 19.119677 72.905081
22 19.137815 72.914085
23 19.137815 72.914085
24 19.112955 72.910102
25 …Run Code Online (Sandbox Code Playgroud) cluster-analysis ×10
python ×5
dbscan ×3
scikit-learn ×3
algorithm ×2
data-mining ×2
k-means ×2
canvas ×1
java ×1
javascript ×1
math ×1
nlp ×1
numpy ×1
python-2.7 ×1
scipy ×1
webgl ×1
word2vec ×1
wordnet ×1