模式识别的课程作业,要求实现一个k-means算法,并深入分析.不知道为什么老师讲的算法名字叫c-means.(课程报告仅供参考,避免全部一样)
k-means算法介绍
kmeans算法又名k均值算法。其算法思想大致为:先从样本集中随机选取 k 个样本作为簇中心,并计算所有样本与这 k 个“簇中心”的距离,对于每一个样本,将其划分到与其距离最近的“簇中心”所在的簇中,对于新的簇计算各个簇的新的“簇中心”。
根据以上描述,可以得出算法的基本步骤:
- 初始化常数K,随机选取初始点为质心
- while : 直到质心不再改变
- 计算样本与每个质心之间的相似度,
- 将样本归类到最相似的类中
- 重新计算质心
- 输出最终的质心以及每个类
import numpy as np
import matplotlib.pyplot as plt
import random
#加载数据
def loadData(filename):
dataSet = []
with open(filename) as fr:
for l in fr.readlines():
indata = l.strip().split('\t')
dataSet.append([float(x) for x in indata])
dataSet = np.array(dataSet)
return dataSet
#欧式距离
def disEclud(vec1, vec2):
return ((vec1 - vec2) ** 2).sum(axis = 1) ** 0.5
#初始化类心
def initCent(dataSet, k):
m, n = np.shape(dataSet)
centroids = dataSet[random.sample(range(m), k)]
return centroids
def kMeans(dataSet, k):
m = dataSet.shape[0]
#类心
centroids = initCent(dataSet, k)
#分类
clusterAssment = np.zeros(m)
clusterChange = np.array(centroids)
while True:
for i in range(m):
dis = disEclud(dataSet[i], centroids)
clusterAssment[i] = dis.argmin()
for cent in range(k):
centroids[cent] = dataSet[np.where(clusterAssment == cent)].mean(axis = 0)
if (centroids == clusterChange).all():
break
else:
clusterChange = np.array(centroids)
continue
return cen