我有一个数据集,该数据集包含48000行和24列,每列都已规范化,因此它的值介于0到1之间。
我尝试将数据聚类为曲线,但是不确定我的实现是否正确:
cluster_num = 8
kclustering = KMeans(n_clusters=cluster_num, random_state=RAND).fit(df_reads)
kclustering.transform(df_reads)
查看数据时,我看到:
>> kclustering.cluster_centers_[0]
array([ 0.44851436, 0.40071485, 0.37478944, 0.36488641, 0.37286438,
0.4042693 , 0.47056609, 0.502428 , 0.47682049, 0.47377337,
0.47723668, 0.49041012, 0.5107349 , 0.53044935, 0.55766196,
0.61032937, 0.66640804, 0.72395814, 0.77165046, 0.8449527 ,
0.83843484, 0.75404816, 0.63712833, 0.5259275 ])
我想通过阅读 sklearn web page 中的文档和源代码来确认对kmeans的理解:
拟合-此函数将kmeans模型适合作为[n_samples,m_features]提供的数据,在这种情况下,n是48000个样本,m是24个要素。
转换-将数据转换为群集距离空间。根据我的测试,它返回一个[n_samples,m_clusters]数组,其中n_samples为48000,m_clusters为8(由上面声明的8个聚类定义),它显示了每个样本与每个聚类的距离。
>> kclustering.transform(df_reads)[0]
array([ 0.76017856, 1.69920653, 0.81333364, 1.21883207, 1.65154547,
0.83507006, 1.6426527 , 1.35372735])
预测-获取与“拟合”步骤匹配的另一组[n_samples,m_features]个数据集,并为每个样本分配一个簇号,返回大小为[1,n_labels]的数组,其中n为48000在这种情况下。
在我查找的示例中,我看到了对“ transform”方法的调用,但是此转换步骤是否必要?无论有没有这一行,cluster_centers_都完全相同:
kclustering.transform(df_reads)
如果是这样,是否不应该将其分配给变量?似乎该行没有在程序的功能中发挥作用。
根据我的理解,变换将[48000,24]数据集转换为[48000,8],并分配了与每个群集的距离,但是该变换实际上并没有计算距离,该步骤似乎发生在之所以选择“适合”,是因为“ precompute_distances”参数默认设置为“自动”,在文档指定的位置:
“自动”:如果n_samples * n_clusters> 12,则不预先计算距离 百万。这相当于使用双倍每个作业大约100MB的开销 精度。
是否由于对内存的担忧而从未将'precompute_distances'设置为True的唯一原因?如果将precompute_distances设置为False,那么此时是否需要调用'Transform'?
最后,从原始数据帧中提取了24个特征,如果我想将每个样本的聚类标签与原始记录进行匹配,是否像在kmeans.labels上使用pd.concat()一样简单?原始数据框的搜索结果,以找出为每个标签分配了哪个主键?
这就是我所做的,但是我不确定如何使用concat时如何验证是否分配了正确的标签,除了手动查找多个样本并尝试映射其曲线与分配的聚类曲线。
谢谢!