使用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
相关产品推荐
相关产品推荐

