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

时间:2011-11-19 10:58:31

标签: python machine-learning data-mining k-means prediction

我正在搞乱机器学习,我在Python中编写了K Means算法实现。它采用二维数据并将它们组织成簇。每个数据点的类值也为0或1。

让我对算法感到困惑的是,我如何使用它来预测另一组二维数据的某些值,这些数据没有0或1,而是未知。对于每个群集,我应该将其中的点平均为0还是1,如果未知点最接近该群集,那么该未知点将采用平均值?或者有更聪明的方法吗?

干杯!

4 个答案:

答案 0 :(得分:8)

要将新数据点分配给由k-means创建的一组群集中的一个,您只需 找到最接近 的质心。

换句话说,您使用相同的步骤将原始数据集中的每个点迭代分配给k个簇中的一个。这里唯一的区别是你用于此计算的质心是 final 集 - 即, last 迭代中的质心值。

这是 python (w / 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])

答案 1 :(得分:1)

如果您正在考虑根据最近群集中的平均值分配值,那么您正在谈论某种形式的“软解码器”,它不仅会估计坐标的正确值,还会估计您对估计值的置信度。 。替代方案是“硬解码器”,其中只有0和1的值是合法的(出现在训练数据集中),并且新坐标将得到最近的簇内的值的中值。我的猜测是你应该总是只为每个坐标分配一个已知有效的类值(0或1),并且平均类值不是一种有效的方法。

答案 2 :(得分:1)

我知道我可能会迟到,但这是我解决问题的一般方法:

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)

答案 3 :(得分: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'])

我希望它有所帮助