这里是两个非监督算法:
1>遍历整所有的vector,计算两两vector的距离,找出距离最小的两个集合 将其合并
合并后的vector为 (v1+v2)/2
重复 1>直到只有一个集合位置
注意这个过程的时间复杂度是O(k*n
),而层次聚类是"n平方",效果好得多
聚类还是很有用滴:比如,对数据进行聚类,发现套套和啤酒靠得非常近,说明啤酒和套套放在一起可能会增加收入。比如哥们买一瓶酒的时候顺便买个套套,酒后很可能那个啥了。。。
聚类首先要解决的是解决两个集合的的相似程度的问题。
我们使用一个distance(v1,v2)来表示两个集合的相似程度,distance越小越相似
v1,v2是两个向量,如果有非数值的参数可以想办法将它量化
算法一:hierarchicalclustering(层次聚类):
其实 回想一下huffman算法,跟这个最过程异曲同工。每一次都找最小的两个合并。
整个算法的时间复杂度是:n3次方.有点恐怖
算法二 k-mean算法:
层次分类并没有把集合真正地分开,而是建立了一棵二叉树,而且每次遍历整个集合计算两两vector之间的距离,时间复杂度是O(n平方)。
k-mean算法可以将集合分为k个独立的 集合。
k-mean的算法如下
1、随机生成k个vector.和其对应的集合set
2、遍历整个集合,找到与k个vector中每一个vector距离最近的那个vector,将其加入到对应的set中
3、计算每一个set的平均值(也就是每一个set的中心)(v1+v2+...+vm)/m
4、 重复1到3直到算法结束
整个算法的时间复杂度是k*n平法,比层次分类好得多。
k-mean这个词的理解,k代表将这个集合分为k个独立的集合。mean是平均的意思,就是计算k个集合中每一个集合的中心的意思,如图