You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:30:52