在Julia中使用Scikit-learn与Python3.11路径



我试图通过各种框架在集群中执行一些基准测试,但是在将Scikit-learn从python移植到julia的情况下,我甚至无法使其工作。下面是代码:

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)
return silhouette_score(Train, model.labels_)
"""
function test(Train, k)
py"Silhouette_py"(Train, k)
end

下面的代码会导致错误:

julia> test(Train, 3)
ERROR: PyError ($(Expr(:escape, :(ccall(#= C:UsersShayan.juliapackagesPyCallygXW2srcpyfncall.jl:43 =# @pysym(:PyObject_Call), PyPtr, (PyPtr, PyPtr, PyPtr), o, pyargsptr, kw))))) <class 'AttributeError'>
AttributeError("'KMeans' object has no attribute 'labels_'")
File "C:UsersShayan.juliapackagesPyCallygXW2srcpyeval.jl", line 5, in Silouhette_py
const _namespaces = Dict{Module,PyDict{String,PyObject,true}}()
^^^^^^^^^^^^^
Stacktrace:
[1] pyerr_check
@ C:UsersShayan.juliapackagesPyCallygXW2srcexception.jl:62 [inlined]
[2] pyerr_check
@ C:UsersShayan.juliapackagesPyCallygXW2srcexception.jl:66 [inlined]
[3] _handle_error(msg::String)
@ PyCall C:UsersShayan.juliapackagesPyCallygXW2srcexception.jl:83
[4] macro expansion
@ C:UsersShayan.juliapackagesPyCallygXW2srcexception.jl:97 [inlined]
[5] #107
@ C:UsersShayan.juliapackagesPyCallygXW2srcpyfncall.jl:43 [inlined]
[6] disable_sigint
@ .c.jl:473 [inlined]
[7] __pycall!
@ C:UsersShayan.juliapackagesPyCallygXW2srcpyfncall.jl:42 [inlined]
[8] _pycall!(ret::PyObject, o::PyObject, args::Tuple{Matrix{Float64}, Int64}, nargs::Int64, kw::Ptr{Nothing})
@ PyCall C:UsersShayan.juliapackagesPyCallygXW2srcpyfncall.jl:29
[9] _pycall!(ret::PyObject, o::PyObject, args::Tuple{Matrix{Float64}, Int64}, kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
@ PyCall C:UsersShayan.juliapackagesPyCallygXW2srcpyfncall.jl:11
[10] (::PyObject)(::Matrix{Float64}, ::Vararg{Any}; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), 
Tuple{}}})
@ PyCall C:UsersShayan.juliapackagesPyCallygXW2srcpyfncall.jl:86
[11] (::PyObject)(::Matrix{Float64}, ::Vararg{Any})
@ PyCall C:UsersShayan.juliapackagesPyCallygXW2srcpyfncall.jl:86
[12] t(Train::Matrix{Float64}, k::Int64)
@ Main .REPL[12]:2
[13] top-level scope
@ REPL[20]:1

libpython及相关材料配置:

julia> PyCall.libpython
"C:\Users\Shayan\AppData\Local\Programs\Python\Python311\python311.dll"
julia> PyCall.pyversion
v"3.11.0"
julia> PyCall.current_python()
"C:\Users\Shayan\AppData\Local\Programs\Python\Python311\python.exe"
<标题>

进一步测试但是如果我说:

julia> sk = pyimport("sklearn")
julia> model = sk.cluster.KMeans(3)
PyObject KMeans(n_clusters=3)
julia> model.fit(Train)
sys:1: ConvergenceWarning: Number of distinct clusters (1) found smaller than n_clusters (3). Possibly due to duplicate points in X.
PyObject KMeans(n_clusters=3)
julia> model.labels_
1611-element Vector{Int32}:
0
0
0
0
0
0
⋮

但是我需要它在一个函数中工作。如您所见,在本例中它不再抛出AttributeError("'KMeans' object has no attribute 'labels_'")

这似乎行得通:

KMeans = pyimport("sklearn.cluster").KMeans
silhouette_score = pyimport("sklearn.metric").silhouette_score
Train = rand(Float64, 1611, 10);
function test(Train, k)
model = KMeans(k)
model.fit(Train)
return silhouette_score(Train, model.labels_)
end
julia> test(Train, 3)
0.7885442174636309

最新更新