python - sklearn:垃圾箱必须单调递增或递减
问题描述
我有一个 Python 列表,其中包含连续值(从 0 到 1020),我想使用 K-Means 策略以 0 到 5 的序数值对其进行描述。
我已经使用新类sklearn.preprocessing.KBinsDiscretizer
来执行此操作:
def descritise_kmeans(python_arr, num_bins):
X = np.array(python_arr).reshape(-1, 1)
est = KBinsDiscretizer(n_bins=num_bins, encode='ordinal', strategy='kmeans')
est.fit(X)
Xt = est.transform(X)
return Xt
运行此方法时,出现错误:
/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/preprocessing/_discretization.py in transform(self, X)
262 atol = 1.e-8
263 eps = atol + rtol * np.abs(Xt[:, jj])
--> 264 Xt[:, jj] = np.digitize(Xt[:, jj] + eps, bin_edges[jj][1:])
265 np.clip(Xt, 0, self.n_bins_ - 1, out=Xt)
266
ValueError: bins must be monotonically increasing or decreasing
仔细观察时,似乎numpy.descritize
方法是引发错误的方法。这似乎是 Sklearn 库的错误。
当 bin 数量n_bins
为 6 时,将引发错误。但是,当n_bins
为 5 时,它可以工作。
解决方案
我遇到了类似的问题,我发现我在为垃圾箱设置值时犯了错误。我的代码很简单
bins = np.array([0.0, .33, 66, 1])
data = [0.1, .2, .4, .5, .7, 8]
inds = np.digitize(data, bins, right=False)
我在 0.66 之前错过了一个点,而且我的垃圾箱不是单调的。虽然它可能不是这个问题的问题根源,但我希望它对某人有所帮助。
推荐阅读
- javascript - Cloud Firestore:使用 Javascript 检索动态字段键
- android - 如何在 android 中通过短信发送我的位置坐标?
- android - 如何使用具有相同 Fragment 的 4 个简单 ViewModel?
- office-ui-fabric - 如何在 Office UI Fabric React 中使用备用图标
- excel - 无法使用 vba excel 播放 midi 文件
- python - dtype 对象不支持 unique 的轴参数
- ios - 为什么swift 4 codable在解析时会抛出错误
- vue.js - Laravel 5.6 & vue.js 路由器 404
- c - 尝试一个基本的音频电平出纳器,但它给出了错误的答案
- html - CSS 3D 垂直翻转效果动画看起来不正确