我一直在研究k-means聚类,有一点不清楚你是如何选择k的值的.这只是一个反复试验的问题,还是有更多的问题?
所以,我正在使用非常稀疏的numpy数组进行一些Kmeans分类 - 很多很多零.我想我会使用scipy的'稀疏'软件包来减少存储开销,但我对如何创建数组而不是矩阵有点困惑.
我已经完成了关于如何创建稀疏矩阵的教程:http: //www.scipy.org/SciPy_Tutorial#head-c60163f2fd2bab79edd94be43682414f18b90df7
为了模拟一个数组,我只是创建一个1xN矩阵,但正如你可能猜到的,Asp.dot(Bsp)不能正常工作,因为你不能将两个1xN矩阵相乘.我必须将每个数组转换为Nx1,这非常蹩脚,因为我会为每个点积计算做这个.
接下来,我尝试创建一个NxN矩阵,其中第1列==第1行(这样您可以将两个矩阵相乘,只需将左上角作为点积),但结果证明效率非常低.
我喜欢使用scipy的稀疏包作为numpy的数组()的神奇替代品,但到目前为止,我还不确定该怎么做.
有什么建议?
我正在寻找k-means算法的Python实现,并带有示例来聚类和缓存我的坐标数据库.
在维基百科页面上,描述了用于确定k均值中的聚类数量的肘方法.scipy的内置方法提供了一个实现,但我不确定我是否理解它们所称的失真是如何计算的.
更确切地说,如果您绘制由集群解释的方差百分比与集群数量的关系图,则第一个集群将添加大量信息(解释大量方差),但在某些时候边际增益将下降,从而给出一个角度.图形.
假设我的相关质心有以下几点,那么计算这个量度的好方法是什么?
points = numpy.array([[ 0, 0],
[ 0, 1],
[ 0, -1],
[ 1, 0],
[-1, 0],
[ 9, 9],
[ 9, 10],
[ 9, 8],
[10, 9],
[10, 8]])
kmeans(pp,2)
(array([[9, 8],
[0, 0]]), 0.9414213562373096)
Run Code Online (Sandbox Code Playgroud)
我特别考虑计算0.94 ..测量给出的点和质心.我不确定是否可以使用任何内置的scipy方法,或者我必须编写自己的方法.关于如何有效地为大量积分做这些的任何建议?
简而言之,我的问题(所有相关的)如下:
编辑2:失真
from scipy.spatial.distance import cdist
D = cdist(points, centroids, 'euclidean')
sum(numpy.min(D, axis=1))
Run Code Online (Sandbox Code Playgroud)
第一组点的输出是准确的.但是,当我尝试不同的设置时:
>>> pp = numpy.array([[1,2], [2,1], [2,2], [1,3], [6,7], [6,5], [7,8], [8,8]])
>>> kmeans(pp, 2)
(array([[6, 7],
[1, 2]]), 1.1330618877807475)
>>> …Run Code Online (Sandbox Code Playgroud) 在相对小的项目做的Python让我欣赏这种语言的动态类型性质(无需申报代码跟踪的类型),这往往使沿途更快,痛苦少的发展过程.但是,我觉得在更大的项目中,这实际上可能是一个障碍,因为代码运行速度比在C++中等效.但话又说回来,使用numpy的和/或SciPy的使用Python可以让你的代码作为一个本地C++程序(其中在C++代码有时会需要更长的时间来开发)一样跑得快.
我在阅读Justin Peel对线程" Python是否比C++更快,更轻? " 的评论后发布了这个问题,他说:"而且,那些谈论Python对于严重数字运算缓慢的人并没有使用Numpy和Scipy模块. Python是真正起飞在科学计算的这些日子.当然,速度来自使用用C或Fortran语言编写的库模块,但是这在我看来,一个脚本语言的美." 或者,正如·洛写关于Python的在同一线程上:"......既然管理内存对我来说,我没有做任何的内存管理,节约追逐核泄漏的时间." 我还考察了一个Python/numpy的/ C++相关的性能问题的" 标杆(蟒蛇与C++使用BLAS)和(numpy的) ",其中JF塞巴斯蒂安写道:"......这里是C之间和numpy的我的机器上没有区别++".
这两个线程让我想知道,对于使用Numpy/Scipy生成软件来分析"大数据"的Python程序员来说,知道C++是否有任何真正的优势,其中性能显然非常重要(还有代码可读性和开发)速度是必须的)?
注意:我对处理大量文本文件特别感兴趣.具有多列的100K-800K行的文本文件,其中Python可能需要花费五分钟来分析"仅"200K行的文件.
我有一个包含分类(名义和序数)和数字属性的数据集.我想使用这些混合属性在我的观察中计算(dis)相似性矩阵.使用R中集群包的daisy()函数,我可以很容易地获得如下的相异矩阵:
if(!require("cluster")) { install.packages("cluster"); require("cluster") }
data(flower)
as.matrix(daisy(flower, metric = "gower"))
Run Code Online (Sandbox Code Playgroud)
这使用gower度量来处理名义变量.是否有一个Python相当于daisy()R 中的函数?
或者也许任何其他模块函数允许使用Gower指标或类似的东西计算具有混合(名义,数字)属性的数据集的(dis)相似性矩阵?
的k均值++算法有助于以下两个原始K-means算法的要点:
但是k-means ++有什么缺点吗?从现在开始我们应该总是使用它而不是k-means吗?
我希望使用kmeans算法对某些数据进行聚类,但是我想使用自定义距离函数。有什么办法可以更改scikit-learn使用的距离函数?
我还将选择一个不同的框架/模块,该框架/模块可以交换距离函数并可以并行计算kmeans(我想加快计算速度,这是scikit-learn的一个不错的功能)
有什么建议么?
是否有任何选项可以在Mahalanobis中进行聚类,或者可以轻松地与Opencv一起使用
cv2.kmeans
Run Code Online (Sandbox Code Playgroud)
在python中的功能?
给定一个 NxM 特征向量作为 numpy 矩阵。是否有任何例程可以使用 L1 距离(曼哈顿距离)通过 Kmeans 算法对其进行聚类?
scipy.sparse.issparse 在这篇文章中使用。
是否可以使用 scikit-learn K-Means Clustering 指定您自己的距离函数?
但是,我不知道它是如何工作的。我已经找到了文件,它是空的。 http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.issparse.html
from scipy.sparse import issparse
issparse([0, 0, 0])
>> False
issparse([[1, 0, 0], [0, 0, 0]])
>> False
Run Code Online (Sandbox Code Playgroud)
它总是返回False。我怎样才能让它回来True?
python ×9
k-means ×5
numpy ×4
scipy ×3
algorithm ×2
benchmarking ×1
c++ ×1
comparison ×1
matrix ×1
opencv ×1
performance ×1
r ×1
r-daisy ×1
scikit-learn ×1
similarity ×1
statistics ×1