UMAP降维报错:ufunc 'correct_alternative_cosine'不匹配float32类型
解决UMAP处理大样本时
correct_alternative_cosine类型匹配错误 问题分析
这个错误源于UMAP中cosine度量相关的numba编译函数不支持float32数据类型,当数据集规模超过5000行时触发了类型不兼容的执行分支。
解决方案
1. 将嵌入向量转换为float64类型
直接把embeddings从float32转为float64,适配UMAP的cosine度量函数类型要求:
embeddings = my_embedder.encode( data_df.normalization.values, show_progress_bar=False ) # 转换数据类型 embeddings = embeddings.astype(np.float64) umap_embeddings = umap.UMAP( n_neighbors=np.min([5, data_df.shape[0]]), n_components=3, metric='cosine', random_state=17 ).fit_transform(embeddings)
2. 升级依赖库版本
当前使用的umap-learn(0.5.3)和numba(0.55.1)版本较旧,后续版本修复了不少类型兼容问题。通过poetry更新:
# 在pyproject.toml中更新版本约束 numpy = "^1.24.4" umap-learn = "^0.5.4" numba = "^0.56.4"
执行更新命令:
poetry update umap-learn numba
注:numba 0.56+适配numpy 1.21-1.24版本,当前numpy 1.24.4符合兼容要求。
3. 替换余弦度量为归一化后的欧氏距离
余弦距离与L2归一化后的欧氏距离等价,可绕开cosine度量的类型问题:
embeddings = my_embedder.encode( data_df.normalization.values, show_progress_bar=False ) # L2归一化嵌入向量 embeddings = embeddings / np.linalg.norm(embeddings, axis=1, keepdims=True) umap_embeddings = umap.UMAP( n_neighbors=np.min([5, data_df.shape[0]]), n_components=3, metric='euclidean', # 改用欧氏度量 random_state=17 ).fit_transform(embeddings)
内容的提问来源于stack exchange,提问作者Harvindar Singh Garcha
相关产品推荐
相关产品推荐

