聚类算法
——python
实现学习向量量化(
LVQ
)算法
2017/05/13 2391
算法思想
学习向量量化算法和
K
均值算法类似,是找到一组
原型向量来聚类,
每一个原型向量代表一个簇,将空间划分为若干个簇,从而对于
任意的样本,可以将它划入到与它距离最近的簇中。特别的是
LVQ
假设数据样本
带有类别标记,可以用这些类别标记来辅助聚类。
大致思想如下:
1.
统计样本的类别,假设一共有
q
类,初始化为原型向量的
标记为
{t1,t2,……,tq}
。从样本中随机选取
q
个样本点位原型向量
{p1, p2 ,……, pq}
。
初始化一个学习率
a,a
取值范围
(0,1)
。
2.
从样本集中随机选取一个样本
(x, y)
,计
算该样本与
q
个原型向量的距离(欧几里得距离)
,找到最小的那个原型向量
p
,判
断样本的标记
y
与原型向量的标记
t
是不是一致。若一致则更新为
p
’
=
p
+
a*(x-
p)
,否则更新为
p
’
= p - a*(x - p)
。
3.
重复第
2
步直到满足停止条件。
(如达到最
大迭代次数)
4.
返回
q
个原型向量。
举例说明
样本集比较小,只是举一个例子。
# -*- coding:utf-8 -*-import reimport mathimport numpy as npimport pylab as pldata =
\”““1,0.697,0.46,Y,2,0.774,0.376,Y,3,0.634,0.264,Y,4,0.608,0.318,Y,5,0.556,0.215,Y,6,0.
403,0.237,Y,7,0.481,0.149,Y,8,0.437,0.211,Y,9,0.666,0.091,N,10,0.639,0.161,N,11,0.657,
0.198,N,12,0.593,0.042,N,13,0.719,0.103,N”““#
定义一个西瓜类,四个属性,分别是编
号,密度,含糖率,是否好瓜
class
watermelon:
def
__init__(self,
properties):
self.number
=
properties[0]
self.density
=
float(properties[1])
self.sweet
=
float(properties[2])
self.good
=
properties[3]#
数据简单处理
a
=
re.split(‘,’,
data.strip(“
“))dataset = [] #dataset:
数据集
for i in range(int(len(a)/4)): temp = tuple(a[i * 4: i * 4 + 4])
dataset.append(watermelon(temp))#
计算欧几里得距离
,a,b
分别为两个元组
def
dist(a,
b):
return
math.sqrt(math.pow(a[0]-b[0],
2)+math.pow(a[1]-b[1],
2))#
算法模型
def
LVQ(dataset,
a,
max_iter):
#
统计样本一共有多少个分类
T
=
list(set(i.good
for
i
in
dataset)) #
随机产生原型向量
P = [(i.density, i.sweet) for i in np.random.choice(dataset,
len(T))]
while
max_iter
0:
X
=
np.random.choice(dataset,
1)[0]
index
=