You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用clustMixType的predict函数时类型比较未实现错误的解决问询

解决clustMixType中predict函数报错“comparison of these types is not implemented”的问题

错误原因

  • 本质是predict.kproto函数处理分类变量时的类型不兼容:当模型训练时lambda设为NULL,clustMixType自动计算lambda的过程中,会将聚类原型(protos)里的因子列存储为单一行的数据框;而待预测数据中的因子列是普通因子类型,两者执行!=比较时,R无法处理数据框和因子的不等运算,触发报错。
  • 你的代码中is_color_g是因子列,正好触发了这个类型冲突问题。

解决方法

方法1:显式指定lambda参数

避免使用lambda=NULL,手动指定lambda值或用estimateLambda()自动估算,这样kproto会正确存储分类变量的原型为因子向量,确保预测时类型匹配。

修正代码:

library(tidyverse)
library(clustMixType)

my_diamonds <- diamonds %>% 
  mutate(is_color_g = factor(ifelse(color == 'G', 1, 0))) %>% 
  select(cut, carat, is_color_g, depth, table, price) %>% 
  group_by(cut) %>% 
  nest %>% 
  mutate(k = 3)

# 用estimateLambda自动估算lambda,或直接指定lambda=1等固定值
my_diamonds <- my_diamonds %>% 
  mutate(mod.kproto = map2(data, k, ~kproto(.x, k = .y, lambda = estimateLambda(.x), iter.max = 100, nstart = 1, na.rm = 'no')))

# 调用predict正常运行
my_diamonds <- my_diamonds %>% 
  mutate(preds = map2(data, mod.kproto, ~predict(.y, .x)))

方法2:将因子列转换为字符型

把分类变量从因子转为字符型,kproto会将其当作分类变量处理,原型存储为字符向量,和待预测数据的字符列比较时不会有类型冲突。如果后续需要,可在预测后转回因子。

修正代码:

library(tidyverse)
library(clustMixType)

my_diamonds <- diamonds %>% 
  mutate(is_color_g = as.character(ifelse(color == 'G', 1, 0))) %>% # 转换为字符型
  select(cut, carat, is_color_g, depth, table, price) %>% 
  group_by(cut) %>% 
  nest %>% 
  mutate(k = 3)

my_diamonds <- my_diamonds %>% 
  mutate(mod.kproto = map2(data, k, ~kproto(.x, k = .y, lambda = NULL, iter.max = 100, nstart = 1, na.rm = 'no')))

# 预测正常执行,如需可后续转回因子
my_diamonds <- my_diamonds %>% 
  mutate(preds = map2(data, mod.kproto, ~predict(.y, .x)))

内容的提问来源于stack exchange,提问作者Doug Fir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:52:45