K-Means算法也被称为K-平均或K-均值算法,是一种广泛使用的聚类算法。K-Means算法是基于相似性的无监督的算法,通过比较样本之间的相似性,将较为相似的样本划分到同一类别中。
K-Means算法聚类图
K-Means算法步骤:
(1)初始化常数K,随机初始化K个聚类中心;
(2)重复计算以下过程,直到聚类中心不再改变;
a.计算每个样本与每个聚类中心之间的相似度,将样本划分到最相似的类别
中;
b.计算划分到每个类别中的所有样本特征的均值,并将该均值作为每个类新的
聚类中心。
(3)输出最终的聚类中心以及每个样本所属的类别。
K-Means算法python代码实现
def kmeans(data, k, centroids):
'''根据KMeans算法求解聚类中心
input: data(mat):训练数据
k(int):类别个数
centroids(mat):随机初始化的聚类中心
output: centroids(mat):训练完成的聚类中心
subCenter(mat):每一个样本所属的类别
'''
m, n = np.shape(data) # m:样本的个数,n:特征的维度
subCenter = np.mat(np.zeros((m, 2))) # 初始化每一个样本所属的类别
change = True # 判断是否需要重新计算聚类中心
while change == True:
change = False # 重置
for i in range(m):
minDist = np.inf # 设置样本与聚类中心之间的最小的距离,初始值为正无穷
minIndex = 0 # 所属的类别
for j in range(k):
# 计算i和每个聚类中心之间的距离
dist = distance(data[i, ], centroids[j, ])
if dist < minDist:
minDist = dist
minIndex = j
# 判断是否需要改变
if subCenter[i, 0] != minIndex: # 需要改变
change = True
subCenter[i, ] = np.mat([minIndex, minDist])
# 重新计算聚类中心
for j in range(k):
sum_all = np.mat(np.zeros((1, n)))
r = 0 # 每个类别中的样本的个数
for i in range(m):
if subCenter[i, 0] == j: # 计算第j个类别
sum_all += data[i, ]
r += 1
for z in range(n):
try:
centroids[j, z] = sum_all[0, z] / r
except:
print(" r is zero")
return subCenter
在机器学习算法中使用的距离函数主要有:
距离函数
闵可夫斯基距离
闵可夫斯基距离
曼哈顿距离
曼哈顿距离
欧式距离
欧式距离
网友评论