聚类算法
是在没有给定划分类别的情况下,根据数据的相似度进行分组的一种方法,分组的原则是组内距离最小化而组间距离最大化。
K-means算法是典型的基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的K类别,采用距离作为相似性的评级指标,即认为两个对象的距离越近,其相似度越大。
kmeans流程
算法过程:
- 从N个样本数据中随机选取K个对象作为初始的聚类质心。
- 分别计算每个样本到各个聚类中心的距离,将对象分配到距离最近的聚类中。
- 所有对象分配完成之后,重新计算K个聚类的质心。
- 与前一次的K个聚类中心比较,如果发生变化,重复过程2,否则转过程5.
- 当质心不再发生变化时,停止聚类过程,并输出聚类结果。
数据集介绍
使用sklearn自带的鸢尾花数据集
from sklearn.datasets import load_iris
data = load_iris()
即可导入数据。
数据集中的特征包括:
print("鸢尾花数据集的返回值:\n", iris)
# 返回值是一个继承自字典的Bench
print("鸢尾花的特征值:\n", iris["data"])
print("鸢尾花的目标值:\n", iris.target)
print("鸢尾花特征的名字:\n", iris.feature_names)
print("鸢尾花目标值的名字:\n", iris.target_names)
print("鸢尾花的描述:\n", iris.DESCR)
我们这里只使用目标是和特征值,这个特征值经过print是一个四维向量。
鸢尾花的target只包括三种花,所以k=3时候理论上最佳。编写代码的时候将target一并写入数组进行组合,这样在聚类完成后进行验证分类的错误率来衡量算法好坏。
代码简介
代码除了调用数据集和划分数据集使用到了sklearn的库函数之外,其余全部使用python自带的list结构或set结构和numpy相关函数实现。
主函数
第一次随机选取核心,就取数据集的前k个分别作为中心
def main(x,y,k,max_iter,interrupte_distance = 0):
#x是数据集,y是标签,k是聚类数目,终止距离和最大迭代数目.
#第一步初始化ak
a=[]
a_check = []#用于之后检查准确率
for i in range(k):
a.append([x.pop(0)])
a_check.append([y.pop(0)])
#初始化完了,来一遍第一次
for i in range(len(x)):
dist = []
for num in range(k):
dist.append(calc_distance(a[num][0],x[i]))