HDBSCAN运行报错:'float'对象无法解析为整数,求解决方案
问题:HDBSCAN运行报错TypeError: 'float' object cannot be interpreted as an integer
我用HDBSCAN处理基因表达数据集已经几周了,之前运行完全正常,但最近突然执行失败,代码如下:
clusterer = hdbscan.HDBSCAN(min_cluster_size=10, min_samples=1).fit(df)
报错信息:
TypeError: 'float' object cannot be interpreted as an integer
这明显不合理,因为我的数据集从一开始就只有float类型数据,而且之前一直正常运行。另外把数据转成整数完全没意义,会丢失所有数据含义。
完整错误栈如下:
TypeError Traceback (most recent call last) Cell In[18], line 1 ----> 1 clusterer = hdbscan.HDBSCAN(min_cluster_size=10, min_samples=1).fit(df.select_dtypes(include='number')) 2 df_cluster = pd.DataFrame({'samples':df['SAMPLES'],'labels': df['labels'], 'clusters': clusterer.labels_,'probabilities': clusterer.probabilities_}) 3 df_cluster File ~/opt/anaconda3/envs/env_test/lib/python3.8/site-packages/hdbscan/hdbscan_.py:1205, in HDBSCAN.fit(self, X, y) 1195 kwargs.pop("prediction_data", None) 1196 kwargs.update(self._metric_kwargs) 1198 ( 1199 self.labels_, 1200 self.probabilities_, 1201 self.cluster_persistence_, 1202 self._condensed_tree, 1203 self._single_linkage_tree, 1204 self._min_spanning_tree, -> 1205 ) = hdbscan(clean_data, **kwargs) 1207 if self.metric != "precomputed" and not self._all_finite: 1208 # remap indices to align with original data in the case of non-finite entries. 1209 self._condensed_tree = remap_condensed_tree( 1210 self._condensed_tree, internal_to_raw, outliers 1211 ) File ~/opt/anaconda3/envs/env_test/lib/python3.8/site-packages/hdbscan/hdbscan_.py:824, in hdbscan(X, min_cluster_size, min_samples, alpha, cluster_selection_epsilon, max_cluster_size, metric, p, leaf_size, algorithm, memory, approx_min_span_tree, gen_min_span_tree, core_dist_n_jobs, cluster_selection_method, allow_single_cluster, match_reference_implementation, **kwargs) 820 elif metric in KDTREE_VALID_METRICS: 821 # TO DO: Need heuristic to decide when to go to boruvka; 822 # still debugging for now 823 if X.shape[1] > 60: --> 824 (single_linkage_tree, result_min_span_tree) = memory.cache( 825 _hdbscan_prims_kdtree 826 )( 827 X, 828 min_samples, 829 alpha, 830 metric, 831 p, 832 leaf_size, 833 gen_min_span_tree, 834 **kwargs 835 ) 836 else: 837 (single_linkage_tree, result_min_span_tree) = memory.cache( 838 _hdbscan_boruvka_kdtree 839 )( (...) 849 **kwargs 850 ) File ~/opt/anaconda3/envs/env_test/lib/python3.8/site-packages/joblib/memory.py:349, in NotMemorizedFunc.__call__(self, *args, **kwargs) 348 def __call__(self, *args, **kwargs): --> 349 return self.func(*args, **kwargs) File ~/opt/anaconda3/envs/env_test/lib/python3.8/site-packages/hdbscan/hdbscan_.py:265, in _hdbscan_prims_kdtree(X, min_samples, alpha, metric, p, leaf_size, gen_min_span_tree, **kwargs) 260 core_distances = tree.query( 261 X, k=min_samples + 1, dualtree=True, breadth_first=True 262 )[0][:, -1].copy(order="C") 264 # Mutual reachability distance is implicit in mst_linkage_core_vector --> 265 min_spanning_tree = mst_linkage_core_vector(X, core_distances, dist_metric, alpha) 267 # Sort edges of the min_spanning_tree by weight 268 min_spanning_tree = min_spanning_tree[np.argsort(min_spanning_tree.T[2]), :] File hdbscan/_hdbscan_linkage.pyx:55, in hdbscan._hdbscan_linkage.mst_linkage_core_vector() File hdbscan/_hdbscan_linkage.pyx:144, in hdbscan._hdbscan_linkage.mst_linkage_core_vector() TypeError: 'float' object cannot be interpreted as an integer
可能的原因及解决办法
- HDBSCAN版本兼容性:近期若更新过HDBSCAN,新版本的Cython底层代码可能对参数或数据类型校验更严格。可以回退到之前能正常运行的版本:
pip install hdbscan==[你之前使用的版本号] - 数据维度异常:检查数据集的列数是否为整数类型。报错路径显示当列数>60时会调用
_hdbscan_prims_kdtree,如果列数被意外转为float类型,会触发该错误。执行以下代码确认维度:
若维度是float,需排查数据处理流程中是否不小心修改了维度属性,确保行列数为整数。print(df.select_dtypes(include='number').shape) - 参数类型错误:确认所有需要整数的参数(如
min_cluster_size、min_samples、leaf_size等)均为整数类型,避免传递float值。 - 数组类型适配:尝试将数据集转换为
numpy.float64类型后再传入模型:import numpy as np X = df.select_dtypes(include='number').values.astype(np.float64) clusterer = hdbscan.HDBSCAN(min_cluster_size=10, min_samples=1).fit(X)
内容的提问来源于stack exchange,提问作者Nozelar
相关产品推荐
相关产品推荐

