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

使用sklearn.KernelDensity指定'silverman'/'scott'带宽报类型错误

问题解决:KernelDensity使用'silverman'/'scott'带宽触发TypeError

错误原因

你遇到的问题核心是scikit-learn版本过低——bandwidth参数支持'silverman'或'scott'字符串取值是scikit-learn 0.24版本才新增的功能,旧版本仅接受浮点数类型的带宽值,传入字符串会触发类型比较错误。

解决方案

方案1:升级scikit-learn

执行以下命令升级到支持该特性的版本:

pip install --upgrade scikit-learn

升级后直接运行原有代码即可正常使用'silverman'或'scott'作为带宽参数。

方案2:手动计算带宽值(适用于无法升级版本的场景)

如果暂时无法升级库,可以手动计算两种规则对应的带宽值,再传入浮点数:

  • Scott规则:带宽 = 1.059 × 标准差 × (样本量)^(-1/5)
  • Silverman规则:带宽 = 0.9 × min(标准差, 四分位距/1.34) × (样本量)^(-1/5)

对应代码示例:

import pandas as pd
from sklearn.neighbors import KernelDensity
import numpy as np

X = pd.Series([0,1,1,4,5,8])
X = X.to_numpy().reshape(-1,1)

# 计算Scott带宽
n = len(X)
std = np.std(X)
scott_bandwidth = 1.059 * std * (n ** (-1/5))

# 计算Silverman带宽
iqr = np.percentile(X, 75) - np.percentile(X, 25)
silverman_bandwidth = 0.9 * min(std, iqr / 1.34) * (n ** (-1/5))

# 使用手动计算的带宽拟合KDE
kde_scott = KernelDensity(kernel='epanechnikov', bandwidth=scott_bandwidth).fit(X)
kde_silverman = KernelDensity(kernel='epanechnikov', bandwidth=silverman_bandwidth).fit(X)

内容的提问来源于stack exchange,提问作者wuethi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:15:35