Anaconda环境下运行scikit-learn的Birch聚类算法报错求助
解决Birch聚类报错:ValueError: ndarray is not C-contiguous
我之前在本地环境里也碰到过一模一样的问题!别的聚类算法都跑得好好的,唯独Birch卡在这里,后来查了才明白,这是因为Birch算法对输入数组的内存布局有严格要求——它需要输入的是C连续(C-contiguous)的numpy数组,但你当前DataFrame底层的数组刚好不是这种布局。而其他聚类算法(比如Kmeans、AgglomerativeClustering)对内存布局没这么苛刻,所以能正常运行。
至于为什么Google Colab里没问题?大概率是Colab环境里的pandas/numpy默认配置和你本地Anaconda Spyder不一样,生成的数组默认就是C连续的,所以没触发这个报错。
下面给你两个亲测有效的解决方案:
方案一:强制转换为C连续数组
直接把DataFrame转换成C连续的numpy数组,再传给Birch:
from sklearn.cluster import Birch import numpy as np # 将DataFrame转换为C连续的float64数组 X = df.to_numpy(dtype=np.float64, order='C') brc = Birch(n_clusters=4, threshold=0.15) cluster_predict = brc.fit_predict(X) print(cluster_predict)
你可以先运行print(df.values.flags.c_contiguous)验证一下,如果返回False,那这个方法肯定能解决问题。
方案二:创建DataFrame的C连续副本
如果你的DataFrame是从其他非连续数组转换而来的,直接创建一个副本也能修复内存布局问题:
# 创建一个C连续的DataFrame副本 df = df.copy() brc = Birch(n_clusters=4, threshold=0.15) cluster_predict = brc.fit_predict(df) print(cluster_predict)
这个方法更简洁,不过如果DataFrame里有复杂的数据类型,还是方案一更稳妥。
我当时就是用方案一解决的,你可以先试试,应该能顺利跑起来Birch聚类了!
内容的提问来源于stack exchange,提问作者Carola
相关产品推荐
相关产品推荐

