使用k均值聚类算法预测值
我在玩机器学习,写了一个用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])