算法描述
输入:簇的数目k;包含n个对象的数据集D。
输出:k个簇的集合。
K-means算法接受输入量k,然后将n种数据对象划分为 k组聚类,使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。
聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”来进行计算的。
无监督学习算法
算法基本步骤
- 从 n个数据对象任意选择 k 个对象作为初始聚类中心;
- 根据每个聚类对象的均值,计算每个对象k个中心点的距离,并根据最小距离重新对相应对象进行划分,把对象划分到与他们最近的中心所代表的类别中去;
- 对于每一个中心点,遍历他们所包含的对象,计算这些对象所有维度的和的均值,获得新的中心点;
- 计算当前状态下的损失(用来计算损失的函数叫做Cost Function,即价值函数),如果当前损失比上一次迭代的损失相差大于某一值(如1),则继续执行第2、3步,知道连续两次的损失差为某一设定值为止(即达到最优,通常设为1)
距离函数
这里使用的是最简单的欧氏距离。计算公式如下:
损失函数(Cost Function)
每一次选取好新的中心点,我们就要计算一下当前选好的中心点损失为多少,这个损失代表着偏移量,越大说明当前聚类的效果越差,计算公式称为(Within-Cluster Sum of Squares, WCSS):
其中,xi表示某一对象,ck表示该对象所属类别的中心点。整个式子的含义就是对各个类别下的对象,求对象与中心点的欧式距离的平方,把所有的平方求和就是L(C)。
评价标准
采用聚类的数据,通常没有已知的数据分类标签,所以通常就不能用监督学习中的正确率、精确度、召回度来计算了(如果有分类标签的话,也是可以计算的)。
常用于聚类效果评价的指标为:Davies Bouldin Index,它的表达式可以写为:
其中,ρi和 ρj 都表示i,j两个分类中的所有对象到中心点的平均距离。而分母中的ci和cj分别表示i,j两个分类的中心点之间的距离。
整个表达式的含义就是,聚类效果越好,两个分类间的距离应该越远,分类内部越密集。
函数扫盲:
zeros(shape[,dtype,order]):依据给点形状和类型返回一个新的元素全为0的数组。
zeros((k,dim))……k行dim列[0.]
map(func,seq1[,seq2...]):将函数func作用于给定序列的每个元素,并用一个列表来提供返回值。如果func为None,func表现为身份函数,返回一个含有每个序列元素集合的n个元组的列表
kmeans算法实践
先建立kmeans.py的脚本文件,里面有四个函数:欧氏距离的计算、初始化类聚中心、k-means类聚、可视化函数。代码如下:
from numpy import *
import time
import matplotlib.pyplot as pyplot
from math import sqrt
#caculate Euclidean distance
def eucDistance(vec1,vec2):
return sqrt(sum(pow(vec2-vec1,2)))
#init centroids with
from numpy import *
import time
import matplotlib.pyplot as pyplot
from math import sqrt
#caculate Euclidean distance
def eucDistance(vec1,vec2):
return sqrt(sum(pow(vec2-vec1,2)))
#init centroids with