我正在尝试机器学习,并用Python编写了一个k均值算法的实现。它可以处理二维数据并将它们组织成聚类。每个数据点还带有一个类值,要么是0,要么是1。
让我困惑的是如何使用这个算法来预测另一组没有0或1,而是未知值的二维数据。对于每个聚类,我是否应该将聚类内的点平均到0或1,如果一个未知点最接近该聚类,那么这个未知点就采用平均值?还是有更智能的方法?
谢谢!
回答:
要将一个新的数据点分配到由k均值创建的一组聚类中,你只需找到离该点最近的质心。
换句话说,就是你对原始数据集中每个点进行迭代分配到k个聚类中的相同步骤。这里的唯一区别是,你用于此计算的质心是最终的集合——即,最后一次迭代时的质心值。
这里是一个用Python(带NumPy)的实现:
>>> import numpy as NP>>> # 只是基于你的规格(二维数据 + 2个聚类)编造的值>>> centroids array([[54, 85], [99, 78]])>>> # 在问题域内随机生成一个新数据点:>>> new_data = NP.array([67, 78])>>> # 要将一个新数据点分配到一个聚类ID,>>> # 找到它最近的质心:>>> diff = centroids - new_data[0,:] # NumPy广播>>> diff array([[-13, 7], [ 32, 0]])>>> dist = NP.sqrt(NP.sum(diff**2, axis=-1)) # 欧几里得距离>>> dist array([ 14.76, 32. ])>>> closest_centroid = centroids[NP.argmin(dist),]>>> closest_centroid array([54, 85])