我正在尝试通过 reticulate R 库使用 R 中的 快速基于密度的聚类验证 (DBCV) Python 包,但我遇到了无法解决的错误。 我使用的是配备 Linux Xubuntu 22.04.05 操作系统、Python 3.11.9 和 R 4.3.1 的 Dell 计算机。
这是我的步骤:
在 shell 终端中,我创建一个 Python 环境,然后安装所需的包:
python3 -m venv dbcv_environment
dbcv_environment/bin/pip3 install scikit-learn numpy
dbcv_environment/bin/pip3 install "git+https://github.com/FelSiq/DBCV"
然后在 R 中,我安装所需的 R 包,调用创建的 Python 环境,生成示例数据集及其标签,并尝试应用
dbcv()
函数:
setwd(".")
options(stringsAsFactors = FALSE)
options(repos = list(CRAN="http://cran.rstudio.com/"))
list.of.packages <- c("pacman")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
library("pacman")
p_load("reticulate")
data <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), nrow = 5, byrow = TRUE)
labels <- c(0,0,1,1,1)
use_virtualenv("./dbcv_environment")
dbcvLib <- import("dbcv")
dbcvLib$dbcv(X=data, y=labels)
但是当我执行最后一个命令时,出现以下错误:
Error in py_call_impl(callable, call_args$unnamed, call_args$named) :
ValueError: zero-size array to reduction operation maximum which has no identity
Run `reticulate::py_last_error()` for details.
有人知道如何解决这个问题吗? 任何帮助将不胜感激,谢谢!
错误
ValueError: zero-size array to reduction operation maximum which has no identity
可能源于这样一个事实:由于示例特征的结构,算法无法识别任何簇
data
(它表明Python无法计算空数组的最大值)。
要检查这里的网状结构没有任何问题,您可以运行等效的 python 代码(您可以将以下代码保存在脚本中并使用 venv 在 shell 中运行)。
import numpy as np
from dbcv import dbcv
# data matrix
data = np.array([[1, 2],
[3, 4],
[5, 6],
[7, 8],
[9, 10]])
# labels array
labels = np.array([0, 0, 1, 1, 1])
# Calculate DBCV score
result = dbcv(X=data, y=labels)
print(result)
穿过网状结构对于明确包含簇的
data
效果很好:
data <- matrix(c(
1, 1, # Cluster 0
1.2, 1.1,
0.8, 1.2,
4, 4, # Cluster 1
4.2, 4.1,
3.8, 4.2
), ncol = 2, byrow = TRUE)
labels <- c(0, 0, 0, 1, 1, 1)
(
result <- dbcvLib$dbcv(X=data, y=labels)
)
[1] 1