使用k-Means聚类算法预测数值

10

我正在研究机器学习,已经用Python编写了K均值算法的实现。它将二维数据组织成聚类。每个数据点还具有0或1的类值。

我对这个算法感到困惑的是,如何使用它来预测另一组没有0或1的二维数据的值,而是未知的。对于每个聚类,我应该对其中的点进行平均处理以得到0或1,如果一个未知点最接近该聚类,则该未知点采用平均值?或者有更聪明的方法吗?

谢谢!

4个回答

18

在k-means聚类算法中,要将一个新的数据点分配给一组已经创建好的聚类中的一个,你只需找到最接近该点的质心。

换句话说,对于原始数据集中的每个点进行迭代分配到k个聚类中所使用的步骤是相同的。唯一的区别是,在此计算中使用的质心是最终集合,即最后一次迭代时质心的值。

以下是一种python实现(使用NumPy):

>>> import numpy as NP
>>> # just made up values--based on your spec (2D data + 2 clusters)
>>> centroids
      array([[54, 85],
             [99, 78]])

>>> # randomly generate a new data point within the problem domain:
>>> new_data = NP.array([67, 78])

>>> # to assign a new data point to a cluster ID,
>>> # find its closest centroid:
>>> diff = centroids - new_data[0,:]  # NumPy broadcasting
>>> diff
      array([[-13,   7],
             [ 32,   0]])

>>> dist = NP.sqrt(NP.sum(diff**2, axis=-1))  # Euclidean distance
>>> dist
      array([ 14.76,  32.  ])

>>> closest_centroid = centroids[NP.argmin(dist),]
>>> closest_centroid
       array([54, 85])

2
我知道我可能有点晚,但这是我针对你的问题提出的通用解决方案:
def predict(data, centroids):
    centroids, data = np.array(centroids), np.array(data)
    distances = []
    for unit in data:
        for center in centroids:
            distances.append(np.sum((unit - center) ** 2))                
    distances = np.reshape(distances, data.shape)
    closest_centroid = [np.argmin(dist) for dist in distances]
    print(closest_centroid)

1
如果您考虑基于最近簇中的平均值分配值,那么您正在谈论某种形式的“软解码器”,它不仅估计坐标的正确值,还估计了您对估计值的信心水平。 另一种选择是“硬解码器”,其中仅0和1的值是合法的(出现在训练数据集中),而新坐标将得到最接近簇内值的中位数。 我的猜测是,您应该始终只分配已知有效的类值(0或1)给每个坐标,并且平均类值不是一个有效的方法。

0
这是我如何为我的最近的现有质心分配标签。实现在线/增量聚类,创建新的分配到现有集群,但保持质心固定也可能很有用。要小心,因为在(假设)5-10%的新点之后,您可能需要重新计算质心坐标。
def Labs( dataset,centroids ):    
a = []
for i in range(len(dataset)):
    d = []
    for j in range(n):        
        dist = np.linalg.norm(dataset[(i),:]-centroids[(j),:])
        d.append(dist)
    assignment = np.argmin(d)
    a.append(assignment)
return pd.DataFrame(np.array(a) + 1,columns =['Lab'])

希望它有所帮助。


请在这里包含一些解释,以及为什么它应该或可能修复OP的问题。这不会帮助他从错误中学习。 - Granny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接