模糊聚类的操作

171 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情

目标

基于模糊系统理论对数据进行聚类

数据

数据组织形式为多个每个行向量是一个数据的多个特征。

步骤介绍

image.png

样本矩阵就是我们的数据,也就是多个行向量。

特别注意,定义两种操作模糊操作,为普通的布尔代数运算的或和与的扩展。

  • 或操作推广为取较大值
  • 与操作推广位取较小值

数据的规格化

目的主要是消除数据之间因为量纲带来的误差,方法有如下几种。

公式及自行实现的代码如下:

 image.png

@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))

image.png

@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

相似矩阵的构造

相似矩阵用来刻画不同行之间的相似程度。

  • 极大极小法

image.png

  • 算术平均值最小法

image.png

  • 几何平均最小法

image.png

注意到这里所有的计算方法都属于两行元素的级别。因此我们可以把流程抽象成两部分实现代码复用,一部分是行的遍历,另一部分是具体的计算逻辑。

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()

至此完成了比较重要的两个部分的实现。 余下的部分下次再说。