Tec*_*ana 4 python machine-learning k-means scikit-learn
我是新手sklearn(和python一般)但需要处理一些涉及超过10k样本聚类的项目.使用以下代码,测试数据集少于100个样本且k = 4,聚类按预期进行.但是,当我开始使用超过100个样本时,6/8质心似乎在原点(0,0)处重复,即它无法生成群集.对于可能出错的事情的任何建议?
码:
data = pd.read_csv('parsed.txt', sep="\t", header=None)
data.columns = ["x", "y"]
kmeans = KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=1000,
n_clusters=k, n_init=10, n_jobs=1, precompute_distances='auto',
random_state=None, tol=0.0001, verbose=0)
kmeans.fit(data)
labels = kmeans.predict(data)
centroids = kmeans.cluster_centers_
fig = plot.figure(figsize=(5, 5))
colmap = {(x+1): [(np.sin(0.3*x + 0)*127+128)/255,(np.sin(0.3*x + 2)*127+128)/255,(np.sin(0.3*x + 4)*127+128)/255] for x in range(k)} # making rainbow colormap
colors = map(lambda x: colmap[x+1], labels) #color for each label
plot.scatter(data['x'], data['y'], color=colors, alpha=0.5, edgecolor='k')
for idx, centroid in enumerate(centroids):
plot.scatter(*centroid, color=colmap[idx+1])
plot.xlim(0, 4000)
plot.ylim(0, 10000)
plot.show()
Run Code Online (Sandbox Code Playgroud)
@ 150个样本,我打印了下面显示的标签(几乎所有2个)和质心坐标(最多来自原点):
[2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2]
[[ 7.51619277e+09 7.51619277e+09]
[ 1.00000000e+27 1.00000000e+27]
[ 0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00]]
Run Code Online (Sandbox Code Playgroud)
更多细节(08/20/17)
以下是GIF,分别显示了86和150个样本的k = 1到10的簇.如图所示,86套装效果不错,但不适用于只出现在原点的150套装.请注意,设置为k = 4帧的150中的颜色变化是由于我定义的色彩映射的结果,因此不是问题的一部分.
如果您尝试查找的数据中确实有这么多群集,您是否先尝试检出?简单地增加样本数量并不一定意味着群集的数量也会增加.如果不.您作为算法输入提供的群集大于实际数量.对于数据集中的聚类,则算法可能无法正确收敛,或者聚类可能简单地(完全)相互重叠.
找到最优的没有.对于您的数据集的集群,我们使用一种称为elbow方法的技术.这种方法有不同的变化,但主要思想是对于不同的K值(簇的数量),你会找到最适合你应用的成本函数(例如,a中所有点的平方距离之和).如果K的所有值为1到8,或者任何其他误差/成本/方差函数,则集群到它的质心.根据您选择的函数,您将看到在某个点之后,值的差异可以忽略不计.我们的想法是,我们选择了'K'的值,所选择的成本函数的值突然变化.
对于值K = 4,方差突然变化.因此,选择K = 4作为适当的值.
图片来源:维基百科
集群验证还有其他几种方法.R中存在几个专门用于此目的的包.
要从以下链接了解更多信息:
| 归档时间: |
|
| 查看次数: |
511 次 |
| 最近记录: |