正文
想象一位“主教”威立于尖塔的阳台,望着城楼下的人群,现在他要做的就是将人分成两类,一类大致可信,一类有些可疑,再逐个把后者中的信众移进前者,“异端”自然被剩下。
这篇文章中,我们就是要实现这样一件事。
从一刀切开始分类
我们先将每个输入都视作单独的一类,以启动整个流程。整个全集记作
C
。
def init(sample_list):
C = []
for x in sample_list:
C.append([x])
return C
复制代码
基于此前定义的字符串集间距离(在文章中简称为类间距离),选择最接近的两类,合并它们。
这步操作听上去很简单,实际上确实也很简单,但我们会遇到一些麻烦:我们一直使用列表来简单表示集合这个数学概念,它们性质并不相同。集合的三个主要特性中,列表不满足无序性与互异性,因此需要一些额外的处理。
例如,找到最接近的两类,无论如何我们也需要计算出 n^2 个距离,这就不是一件轻松的事。我们将最小距离记作
d
——
def find_min(C):
scale = len(C)
d = [[0 for i in range(scale)] for i in range(scale)]
min_d = classesDistanse(C[0], C[1])
where_min_d = [0, 1]
for i in range(scale):
for j in range(scale):
d[i][j] = classesDistanse(C[i], C[j])
if i != j and d[i][j] < min_d:
min_d = d[i][j]
where_min_d = [i, j]
return