使用Impute.jl的KNN插补缺失值时遇MethodError的解决方法
问题:使用Impute.jl的KNN算法插补DataFrame缺失值时出现MethodError
复现代码
using Impute, DataFrames df = DataFrame( a=[1,2,3,4,missing], b=[1, missing, 3, 4, missing], c=[1, 2, missing, 5, 8], ) Impute.knn(Matrix(df), dims=:cols)
报错信息
ERROR: MethodError: no method matching NearestNeighbors.KDTree(::Matrix{Int64}, ::Distances.Euclidean) Closest candidates are: NearestNeighbors.KDTree(::AbstractVecOrMat{T}, ::M; leafsize, storedata, reorder, reorderbuffer) where {T<:AbstractFloat, M<:Union{Distances.Chebyshev, Distances.Cityblock, Distances.Euclidean, Distances.Minkowski, Distances.WeightedCityblock, Distances.WeightedEuclidean, Distances.WeightedMinkowski}} at C:\Users\Shayan\.julia\packages\NearestNeighbors\huCPc\src\kd_tree.jl:85 NearestNeighbors.KDTree(::AbstractVector{V}, ::M; leafsize, storedata, reorder, reorderbuffer) where {V<:AbstractArray, M<:Union{Distances.Chebyshev, Distances.Cityblock, Distances.Euclidean, Distances.Minkowski, Distances.WeightedCityblock, Distances.WeightedEuclidean, Distances.WeightedMinkowski}} at C:\Users\Shayan\.julia\packages\NearestNeighbors\huCPc\src\kd_tree.jl:27
修复方案
错误原因
报错核心是NearestNeighbors库的KDTree不支持整数类型的输入矩阵,它要求数据必须是AbstractFloat(浮点型)。原始DataFrame列是整数类型,转换为Matrix后类型为Matrix{Int64},不符合KDTree的参数要求。
修正代码
方案1:直接定义浮点型DataFrame并调用knn
using Impute, DataFrames # 定义DataFrame时使用浮点型数值 df = DataFrame( a=[1.0,2.0,3.0,4.0,missing], b=[1.0, missing, 3.0, 4.0, missing], c=[1.0, 2.0, missing, 5.0, 8.0], ) # 直接对DataFrame调用knn,无需手动转Matrix imputed_df = Impute.knn(df, dims=:cols)
方案2:转换已有整数DataFrame为浮点型矩阵
如果不想修改原始DataFrame的定义,可以手动转换矩阵类型:
using Impute, DataFrames df = DataFrame( a=[1,2,3,4,missing], b=[1, missing, 3, 4, missing], c=[1, 2, missing, 5, 8], ) # 转换为支持缺失值的浮点型矩阵 float_matrix = Matrix{Union{Missing, Float64}}(df) imputed_matrix = Impute.knn(float_matrix, dims=:cols)
内容的提问来源于stack exchange,提问作者Shayan
相关产品推荐
相关产品推荐

