作为R的新手,我不太确定如何选择最佳数量的聚类来进行k均值分析.绘制下面数据的子集后,适合多少个群集?如何进行聚类dendro分析?
n = 1000
kk = 10
x1 = runif(kk)
y1 = runif(kk)
z1 = runif(kk)
x4 = sample(x1,length(x1))
y4 = sample(y1,length(y1))
randObs <- function()
{
ix = sample( 1:length(x4), 1 )
iy = sample( 1:length(y4), 1 )
rx = rnorm( 1, x4[ix], runif(1)/8 )
ry = rnorm( 1, y4[ix], runif(1)/8 )
return( c(rx,ry) )
}
x = c()
y = c()
for ( k in 1:n )
{
rPair = randObs()
x = c( x, rPair[1] )
y = …
Run Code Online (Sandbox Code Playgroud) 是否可以使用scikit-learn K-Means Clustering指定您自己的距离函数?
python cluster-analysis machine-learning k-means scikit-learn
我一直在研究k-means聚类,有一点不清楚你是如何选择k的值的.这只是一个反复试验的问题,还是有更多的问题?
我正在寻找k-means算法的Python实现,并带有示例来聚类和缓存我的坐标数据库.
我正在寻找最快的算法,通过距离将地图上的点分组为相同大小的组.在K-均值聚类算法看起来简单的和有希望的,但不会产生同样大小的组.
是否存在此算法的变体或不同的算法,允许所有群集的成员数相等?
另请参见:对具有相同大小的k个簇中的n个点进行分组
我无法完全理解k-means ++算法.我很感兴趣的是如何挑选出第一个k质心(剩下的就像在原始的k-means中).
我将欣赏一步一步的解释和一个例子.维基百科中的那个还不够清楚.一个评论很好的源代码也会有所帮助.如果您使用的是6个阵列,那么请告诉我们哪个阵列是为了什么.
language-agnostic algorithm cluster-analysis machine-learning k-means
我在数据帧df1上运行k-means聚类,我正在寻找一种简单的方法来计算新数据帧df2(具有相同变量名称)中每个观察点的最近聚类中心.将df1视为训练集,将df2视为测试集; 我想在训练集上进行聚类,并将每个测试点分配给正确的聚类.
我知道如何使用apply
函数和一些简单的用户定义函数(关于该主题的先前帖子通常提出类似的东西):
df1 <- data.frame(x=runif(100), y=runif(100))
df2 <- data.frame(x=runif(100), y=runif(100))
km <- kmeans(df1, centers=3)
closest.cluster <- function(x) {
cluster.dist <- apply(km$centers, 1, function(y) sqrt(sum((x-y)^2)))
return(which.min(cluster.dist)[1])
}
clusters2 <- apply(df2, 1, closest.cluster)
Run Code Online (Sandbox Code Playgroud)
但是,我正在为一个学生将不熟悉该apply
功能的课程准备这个聚类示例,所以我更喜欢我是否可以使用内置函数将聚类分配给df2.有没有方便的内置函数来查找最近的集群?
在维基百科页面上,描述了用于确定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) 在tensroflow中阅读scikit-learn的实现:http://learningtensorflow.com/lesson6/ 和scikit-learn:http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html 我是努力决定使用哪种实现.
scikit-learn作为tensorflow docker容器的一部分安装,因此可以使用任一实现.
使用scikit-learn的原因:
scikit-learn包含比tensorflow实现更少的锅炉板.
使用tensorflow的原因:
如果在Nvidia GPU上运行算法wilk并行运行,我不确定scikit-learn是否会利用所有可用的GPU?
阅读https://www.quora.com/What-are-the-main-differences-between-TensorFlow-and-SciKit-Learn
TensorFlow更低级别; 基本上,乐高积木可以帮助您实现机器学习算法,而scikit-learn为您提供现成的算法,例如,分类算法,如SVM,随机森林,Logistic回归等等.如果你想实现深度学习算法,TensorFlow真的很棒,因为它可以让你利用GPU进行更有效的训练.
这个陈述重新强化了我的断言"scikit-learn包含的锅炉板比tensorflow实现更少",但也暗示scikit-learn不会利用所有可用的GPU?
我试图在一组高维数据点(大约50维)上应用k-means,并且想知道是否有任何实现找到最佳簇数.
我记得在某处读取算法通常这样做的方式是使群集间距离最大化并且群集内距离最小化但我不记得我在哪里看到它.如果有人可以指出我讨论这个的任何资源,那将是很棒的.我目前正在使用SciPy进行k-means,但任何相关的库都可以.
如果有其他方法可以实现相同或更好的算法,请告诉我.
k-means ×10
python ×5
algorithm ×3
r ×2
scikit-learn ×2
data-mining ×1
map ×1
numpy ×1
statistics ×1
tensorflow ×1