KModes使用已有质心数组初始化的正确语法及报错解决咨询
KModes自定义质心初始化报错解决方案
错误根因
你第一次训练得到的cluster_centroids_输出数组的dtype为统一字符串类型<U11,所有列的元素都被转为了字符串格式,而你的原始输入数据中A1列为整数类型、A2列为字符串类型,类型不匹配导致模型解析质心时尝试将字符串'C'转为整数触发报错。
正确用法
- 先将质心数组的每列类型调整为和原始数据列类型一一对应
- 自定义初始质心时必须将
n_init参数设为1,避免模型重复初始化覆盖你指定的质心
import numpy as np import pandas as pd from kmodes.kmodes import KModes # 原始数据构造代码 att1 = [1,2,3,1,1,2,3,1] att2 = ['A','B','B','A','C','C','C','C'] data1 = list(zip(att1, att2)) test = pd.DataFrame(data=data1, columns =['A1','A2']) # 第一次训练获取初始质心 kmodeTest = KModes(n_clusters=3, init = 'random', n_init = 3, verbose=1).fit(test) cent = kmodeTest.cluster_centroids_ # 调整质心类型,和原数据列类型一一对应 cent_adjusted = np.array([ [int(row[0]), row[1]] for row in cent ], dtype=object) # 用调整后的质心初始化新模型 kmodeTest2 = KModes(n_clusters=3, init = cent_adjusted, n_init = 1, verbose=1).fit(test)
注意事项
- 如果原始数据包含更多不同类型的列,需要逐列匹配原始数据的类型调整质心元素的格式,不要保持全字符串格式
- 自定义质心传入时
n_init必须为1,否则会出现参数冲突警告
内容的提问来源于stack exchange,提问作者Roger Vandomme
相关产品推荐
相关产品推荐

