在 Unsupervised Machine Learning
范畴中,运用比较广泛的算法之一就有 K-means
的身影,今天我们就来聊一聊 K-Means
。
什么是 K-Means Clustering
对于输入 unlabeled
并且未归类的输入数据,我们通过 K-Means 算法来对数据进行归类,整个过程是没有 supervision,换而言之,我们对于数据的归类并不会进行学习,而是并行并按照顺序进行归类。
通畅我们会定义一个 K 变量,这个 K 是一个数量,表示有多少个 group。我们的所有 data points 都会被归入到一个 group 中。 但这个 group 有别于标签,每个 group 是一个 centroid
(一个坐标量),表示一个 Mean 值,接下来我们会用 centroid
和每个 data point 进行比较,哪个 data point 离该 centroid
比较近,我们就归在这个 centroid
中。然后,我们会根据归类情况,重新计算 centroid
的值,然后再用这个坐标量和每个 data point 进行比较,优化归类,直到精确到某一精度,我们停止归类,并返回最终归类结果。我们再次总结一下过程:
- 有 K 个 centroids,我们循环 data points 并把每个 data points 归类于一个 centroids 的,根据 distance 来进行归类。(两个坐标的距离)
- 根据归类结果,重新计算 centroid,(通过均值计算法),重新得到一组新的
centroids
- 重复 1-2 的步骤直至 iteration 结束。通畅我们会指定一个 iteration 次数,例如循环100次。
当然,很多 lib 都已经有很简化的 K-Means 使用方法,我们先尝试自己实现一遍。到最后我会使用 Sklearn 的 K-Means 方法进行计算。
class KMeans:
def __init__(self, k):
self.k = k
self.centroids = np.random.rand(self.k, X.shape[1]) # 这里我们随机生成一组 centroids
def train(self, X, ITER=100, EOL = 1e-3): # ITER 是 iteration 次数,EOL 精确度误差
centroids = np.random.rand(self.k, )
centroidscopy = centroids.copy()
for iter_ in range(ITER):
dist = np.linalg.norm(X-centroids[0,:], axis = 1).reshape(-1, 1) #计算第一列的值和第一个 centroid 的距离
for class_ in range(1, self.k): # 两个分组
dist = np.append(dist, np.linalg.norm(X-centroids[1, :], axis = 1).reshape(-1,1), axis = 1)
classes = np.argmin(dist, axis = 1) #进行分类
for class_ in set(classes): #遍历分类
centroids[class_, :] = np.mean(X[classes == class_, :], axis = 0) #重新计算生成新的 centroids
if centrodis - centroidscopy < EOL: # 如果 centroids 和原来的 data point 误差值很小,则停止遍历
break
self.classes = classes
def predict(self, X):
dist = np.linalg.norm(X - self.centroids[0,:], axis = 1).reshape(-1, 1) # 计算所有第一列与第一个 centroid 的距离,然后根据列进行 norm
for classes_ in range(1, self.k):
dist = np.append(dist, np.linalg.norm(X-centrodis[1,:], axis = 1).reshape(-1, 1), axis = 1) # dist 数组中加上计算所有第二例与第二个 centroid 的距离,然后根据列进行 norm
classes = np.argmin(dist, axis = 1) # 取第一列和第二列的最小值
return classes #返回归类 set
接下来我们来看一下 Sklearn 中的使用方法:
from sklearn import KMeans
kmeans = KMeans(n_clusters = 2, random_state = 0, n_init='auto') #定义 cluster 数量,会随机生成
kmeans.fit(X_train) # fit 我们的 data points
以上就是 K-Means Clustering 的基本概念~ Deep Learning 中还有很多其他很有效的算法,我们下次再见~