问题描述
使用scikit-learn中的聚类算法,可能会遇到以下报错信息:
ValueError: The parameter affinity must be one of {affinities}, but got '{affinity}'
问题分析
由于scikit-learn中不同的聚类算法使用的相似系数函数不同,所以affinity(相似系数函数)的可选值也不同。例如,在谱聚类(spectral clustering)中,可选的相似系数函数包括“rbf”、“nearest_neighbors”和“precomputed”,而在K均值聚类(K-means clustering)中,可选的相似系数函数只包括“euclidean”和“manhattan”。如果在使用聚类算法时指定了不支持的相似系数函数,就会出现以上的报错信息。
解决办法
-
检查指定的相似系数函数是否正确。可以参考文档查看不同聚类算法支持的相似系数函数。
-
如果输入的字符串大小写有问题,也会出现以上报错信息。对于支持大小写的参数,要确保大小写正确。
-
如果以上两种解决办法未能解决问题,可以尝试升级scikit-learn到最新版本。
示例代码
以下示例代码展示了使用K均值聚类算法进行聚类时,指定了不支持的相似系数函数(将“Euclidean”写成了“euclidne”)导致报错:
from sklearn.cluster import KMeans
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],
[4, 2], [4, 4], [4, 0]])
kmeans = KMeans(n_clusters=2, init='k-means++',
n_init=10, max_iter=300,
tol=0.0001, precompute_distances='auto',
verbose=0, random_state=None,
copy_x=True, n_jobs=None,
algorithm='auto', affinity='euclidne',
# 错误:将“Euclidean”写成了“euclidne”
# 记得修改正确后才能运行
compute_full_tree='auto')
kmeans.fit(X)
运行代码后,会出现以下报错信息:
ValueError: The parameter affinity must be one of {‘euclidean’, ‘l1’, ‘l2’, ‘manhattan’, ‘cosine’, ‘precomputed’}, but got ‘euclidne’
修正代码,在"affinity"中将“euclidne”改成“euclidean”即可。