在Julia中调用Python3.11的Scikit-learn聚类函数报错求助
解决Julia中PyCall调用Scikit-learn KMeans时的AttributeError问题
问题出在你定义的Python函数Silhouette_py里:你只初始化了KMeans模型,但没有调用fit()方法训练模型。Scikit-learn的KMeans对象只有在完成训练后才会生成labels_属性,直接访问未训练模型的labels_自然会抛出AttributeError。而你在REPL分步调用时手动执行了model.fit(Train),所以能正常获取标签。
下面是两种修正方案:
方案一:添加模型训练步骤
直接在Python函数中补充fit()调用,让模型完成聚类计算:
using PyCall Train = rand(Float64, 1611, 10) py""" def Silhouette_py(Train, k): from sklearn.metrics import silhouette_score from sklearn.cluster import KMeans model = KMeans(n_clusters=k) model.fit(Train) # 关键:训练模型生成labels_属性 return silhouette_score(Train, model.labels_) """ function test(Train, k) py"Silhouette_py"(Train, k) end
方案二:用fit_predict简化代码
可以直接用fit_predict()方法一步完成训练并返回聚类标签,省去单独访问labels_的步骤:
using PyCall Train = rand(Float64, 1611, 10) py""" def Silhouette_py(Train, k): from sklearn.metrics import silhouette_score from sklearn.cluster import KMeans model = KMeans(n_clusters=k) labels = model.fit_predict(Train) # 训练+获取标签一步完成 return silhouette_score(Train, labels) """ function test(Train, k) py"Silhouette_py"(Train, k) end
额外提示
执行时可能会出现你在REPL里看到的ConvergenceWarning,这是因为随机生成的数据聚类特征不明显,属于正常提示。如果需要屏蔽警告,可以在Python函数里添加警告过滤:
py""" def Silhouette_py(Train, k): import warnings warnings.filterwarnings("ignore") # 屏蔽收敛警告 from sklearn.metrics import silhouette_score from sklearn.cluster import KMeans model = KMeans(n_clusters=k) labels = model.fit_predict(Train) return silhouette_score(Train, labels) """
内容的提问来源于stack exchange,提问作者Shayan
相关产品推荐
相关产品推荐

