在 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 中还有很多其他很有效的算法,我们下次再见~
1202

被折叠的 条评论
为什么被折叠?



