本文主要包含机器学习算法-K-means聚类,算法-k-means聚类等服务器相关知识,网友希望可以进行参考
机器学习算法-K-means聚类,算法-k-means聚类
引文: k均值算法是一种聚类算法,所谓聚类,他是一种无监督学习,将相似的对象归到同一个蔟中。蔟内的对象越相似,聚类的效果越好。聚类和分类最大的不同在于,分类的目标事先已知,而聚类则不一样。因为其产生的结果和分类相同,而只是类别没有预先定义。
算法的目的: 使各个样本与所在类均值的误差平方和达到最小(这也是评价K-means算法最后聚类效果的评价标准)
- 优点:容易实现
- 缺点:可能收敛到局部最小值,在大规模数据上收敛较慢
- 适合数据类型:数值型数据
伪代码
#创建k个点作为起始质心(经常随机选择)
#当任意一个点的蔟分配结果发生变化时
#对数据集中的每个数据点
#对每个质心
#计算质心到数据点之间的距离
#将数据点分配到距其最近的蔟
#对每个蔟,计算蔟中所有点的均值并将均值作为质心
代码实现
因为我们用到的是数值类型的数据,这里编写一个加载数据集的函数,返回值是一个矩阵形式。
下面代码应写在一个py文件里,我这里写在kMeans.py文件中。
文件的头部引入numpy
from numpy import *
数据集加载代码
# 加载数据集文件,没有返回类标号的函数
def loadDataSet(fileName):
dataMat = []
openfile = open(fileName)
for line in openfile.readlines():
curLine = line.strip().split('\t')
floatLine = map(float,curLine)
dataMat.append(floatLine)
return dataMat
因为在k均值算法中要计算点到质心的距离,所以这里将距离计算写成一个函数,计算欧几里得距离公式:
函数代码如下:
# 计算两个向量的欧氏距离
def distEclud(vecA,vecB):
return sqrt(sum(power(vecA-vecB,2)))
接下来初始化k个蔟的质心函数centroid
# 传入的数据时numpy的矩阵格式
def randCent(dataMat, k):
n = shape(dataMat)[1]
centroids = mat(zeros((k,n)))
for j in range(n):
minJ = min(dataMat[:,j]) # 找出矩阵dataMat第j列最小值
rangeJ = float(max(dataMat[:,j]) - minJ) #计算第j列最大值和最小值的差
#赋予一个随机质心,它的值在整个数据集的边界之内
centroids[:,j] = minJ + rangeJ * random.rand(k,1)
return centroids #返回一个随机的质心矩阵
K-means算法
#k-均值算法
def kMeans(dataMat,k,distE = distEclud , createCent=randCent):
m = shape(dataMat)[0] # 获得行数m
clusterAssment = mat(zeros((m,2))) # 初试化一个矩阵,用来记录簇索引和存储误差
centroids = createCent(dataMat,k) # 随机的得到一个质心矩阵蔟
clusterChanged = True
while clusterChanged:
clusterChanged = False
for i in range(m): #对每个数据点寻找最近的质心
minDist = inf; minIndex = -1

