一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
目标
基于模糊系统理论对数据进行聚类
数据
数据组织形式为多个每个行向量是一个数据的多个特征。
步骤介绍
样本矩阵就是我们的数据,也就是多个行向量。
特别注意,定义两种操作模糊操作,为普通的布尔代数运算的或和与的扩展。
- 或操作推广为取较大值。
- 与操作推广位取较小值。
数据的规格化
目的主要是消除数据之间因为量纲带来的误差,方法有如下几种。
公式及自行实现的代码如下:
@add_method("极差正规化")
def mini_max_scale(x: np.ndarray) -> np.ndarray: #
return (x - np.min(x, axis=0)) / (np.max(x, axis=0) - np.min(x, axis=0))
@add_method("最大值规格化")
def maximum_scale(x: np.ndarray) -> np.ndarray: # 最大值缩放
return x / np.max(x, axis=0) # 求每列(dim=0)最大值 做除法
对外部开放接口由其他函数组合提供,相应装饰器的实现如下:
def scale(x: np.ndarray, method: str):
return methods[method](x)
def add_method(name: str):
#高阶函数,生成一个添加名字为 name 的函数到 methods 哈希表中
def method_add(method_func):
methods[name] = method_func
return method_func
return method_add
相似矩阵的构造
相似矩阵用来刻画不同行之间的相似程度。
- 极大极小法
- 算术平均值最小法
- 几何平均最小法
注意到这里所有的计算方法都属于两行元素的级别。因此我们可以把流程抽象成两部分实现代码复用,一部分是行的遍历,另一部分是具体的计算逻辑。
def get_similar_matrix(x: np.ndarray, method: str) -> np.ndarray:
n = len(x) # 求相似矩阵
similar_matrix = np.eye(n) # tensor of answer
for i in range(n):
for j in range(n): # 切点,使用不同的方法
similar_matrix[i, j] = methods[method](x[i], x[j])
return similar_matrix
具体的计算逻辑如下:
@add_method("最大最小法")
def max_mini(x: np.ndarray, y: np.ndarray):
return torch.min(x, y).sum() / torch.max(x, y).sum()
@add_method("算术平均值最小法") # 2 * x/(x+x)
def algo_mini(x: np.ndarray, y: np.ndarray):
return 2 * (torch.min(x, y).sum() / torch.add(x, y).sum())
@add_method("几何平均值最小法")
def geo_mini(x: np.ndarray, y: np.ndarray):
return torch.min(x, y).sum() / torch.sqrt(torch.mul(x, y)).sum()
至此完成了比较重要的两个部分的实现。 余下的部分下次再说。