1、聚类是一种无监督的学习,它将相似的对象归到同一个簇中。簇内的对象越相似,聚类的效果越好。总之,聚类即归类。
2、基本思想:
(1)随机指定需要划分的簇的个数K值
(2)随机地选择k个初始数据对象点作为初始的聚类中心
(3)计算剩下的每个数据到这k个初始聚类中心的距离,然后把离这个中心点距离最近的归在一起。
(4)上面步骤完成后,按照平均法又重新计算各个簇的质心,最后又确定新的聚类中心点
(5)一直迭代,直到簇心的移动距离小于你给定的某个 值。
3、基本步骤:
(1)初始化k个聚类中心
(2)计算出每个元素跟这(k)个中心得距离,(相似度计算),距离与其最小(即相似度最大),那他们就归为同一类(即属于这个中心)。
(3)上一步结束后,得到的新的数据,又重新计算新的聚类中心,和第一次的聚类中心相比较,要是不同就继续第二步,直到新旧两个中心相同,就说明聚类不会再变化了。就是聚类已经成功了。
4、流程图
5、python代码实现
(1)任务:用K-means聚类算法将150个4维样本数据分成3类。
(2)数据集:Iris.txt(想要数据集,可以留言)
(3)代码实现:
# coding=gbk
# python edition: Python3.7
from collections import defaultdict
from random import uniform
from math import sqrt
#第一步读取文件(数据集)
def read_points(): #解析文件
dataset = [] #文件的最后一个字段是类别标签
with open('Iris.txt', 'r') as file:
for line in file:
if line == '\n':
continue
dataset.append(list(map(float, line.split(' '))))
file.close()
return dataset
#第二步:将读取的数据读入到dataset列表中去
def write_results(listResult, dataset, k):
with open('result.txt', 'a') as file:
for kind in range(k):
file.write("CLASSINFO:%d\n" % (kind + 1))
for j in listResult[kind]:
file.write('%d\n' % j)
file.write('\n')
file.write('\n\n')
file.close()
#确定的新的聚类中心
def point_avg(points):
dimensions = len(points[0])
new_center = []
for dimension in range(dimensions):
sum = 0
for p in points:
sum += p[dimension]
new_center.append(float("%.8f" % (sum / float(len