从 R 调用 Python 函数时出现“ValueError:零大小数组到没有标识的归约操作最大值”错误

问题描述 投票:0回答:1

我正在尝试通过 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.

有人知道如何解决这个问题吗? 任何帮助将不胜感激,谢谢!

python r reticulate
1个回答
0
投票

错误

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
© www.soinside.com 2019 - 2024. All rights reserved.