使用k均值聚类算法预测值

10 投票
4 回答
16786 浏览
提问于 2025-04-17 06:38

我在玩机器学习,写了一个用Python实现的K均值算法。这个算法可以处理二维数据,并把它们分成不同的组。每个数据点都有一个类值,要么是0,要么是1。

我对这个算法有点困惑的是,如何用它来预测另一组没有0或1的二维数据,而这些值是未知的。对于每个组,我是不是应该把组内的点平均一下,得出一个0或1的值?如果一个未知点离某个组最近,那这个未知点就取这个平均值?还是说有更聪明的方法呢?

谢谢!

4 个回答

1

如果你在考虑根据最近的聚类中的平均值来给一个值赋值,那你其实是在谈论某种“软解码器”。这个解码器不仅会估算坐标的正确值,还会告诉你对这个估算的信心有多大。另一种方式是“硬解码器”,在这种情况下,只有0和1这两个值是合法的(也就是在训练数据中出现过),新的坐标会取最近聚类中值的中位数。我的猜测是,你应该始终给每个坐标赋一个已知的有效类别值(0或1),而不是通过平均类别值来处理,这样的方法是不太合理的。

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)
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])

撰写回答