基于这篇文章的代码在定义为3个聚类时按预期工作。但是当我更改聚类数量时,返回的聚类数量不等于设定的数量。
from matplotlib import image as imgfrom matplotlib import pyplot as pltimport pandas as pdimage = img.imread("my_logo1.jpg")image.shaper = []g = []b = []for line in image: for pixel in line: temp_r, temp_g, temp_b = pixel r.append(temp_r / 255) g.append(temp_g / 255) b.append(temp_b / 255)df = pd.DataFrame({"red": r, "green": g, "blue": b})from scipy.cluster.vq import kmeanscluster_centers, distortion = kmeans(df[["red", "green", "blue"]], 7)print(cluster_centers)
返回的聚类中心只有3个,预期是7个
我期望返回的颜色数量与kmeans函数中定义的数量相同。
回答:
阅读kmeans()
函数的源代码,你可以注意到使用了一个支持函数_kmeans()
,其中你可以找到:
code_book = code_book[has_members]
has_members
是一个布尔数组,表示哪些聚类有成员,这是由_vq.update_cluster_means()
生成的。
简而言之,当你指定聚类数量k
时,算法会返回一组具有最低失真度的中心点(最多 k
个)。在K-means的更新步骤中,空聚类会被简单地移除。