使用python实现最短距离聚类

写在前面

最近老师布置了一个作业,内容是对国内各省份生产总值与固定资产投资的数据,采用最短距离法进行聚类。原本这种关于矩阵运算的问题用Matlab是比较合适的,奈何Matlab我运用的不是太熟练,所以选择采用python完成。写这篇博客的目的是记录一下代码中使用到的关于Numpy库的一些函数,以及整理一下实现的流程以供需要完成类似功能的小伙伴参考。

使用的Numpy函数

  1. np.zeros:功能是创建一个0矩阵,具体使用
  2. np.max:返回矩阵的最大值,可以根据行或列,具体使用
  3. np.column_stack:将两矩阵按列合并,具体使用
  4. np.shape:返回矩阵的维度,具体使用
  5. np.fabs:得到矩阵的绝对值
  6. np.argwhere:返回查找某数的位置信息,具体使用
  7. np.where:类似于三元表达式,具体使用
  8. np.min:同np.max
  9. np.delete:删除指定行或指定列,具体使用
  10. np.append:添加数据到已有矩阵,具体使用

具体实现流程

1. 读取数据

实验数据格式如下所示。

使用python实现最短距离聚类

读取数据部分思路即将数据逐行读入,设置一个标识以不存入第一行数据,最后根据逗号分割每行的内容并将其分别存入对应的列表中。直接附上源码吧!

def getData(data_file):
    x_data = []
    y_data = []
    global name
    name = []
    iden = 1
    f = open(data_file, "r", encoding='utf_8')
    line = f.readline()
    while line != '':

        if iden == 1:
            iden = iden + 1
            line = f.readline()
            continue

        tem = line.strip('\n').split(',')
        name.append(tem[0])
        x_data.append(tem[1])
        y_data.append(tem[2])
        line = f.readline()
    return list(map(float, x_data)), list(map(float, y_data))

2.数据预处理

极大值标准化

利用np.max函数将数据进行极大值标准化,


    x_max = np.max(x_data)
    y_max = np.max(y_data)
    x = x_data / x_max
    y = y_data / y_max
    maum_value = np.column_stack((x, y))

生成绝对值距离矩阵

由最短距离聚类法的的实现过程可知,需要一个距离矩阵,此处采用较为简单的绝对值距离,公式与代码如下。

使用python实现最短距离聚类

    abs_matrix = np.zeros((len(x_data), len(y_data)))
    for i in range(len(x_data)):
        for j in range(len(y_data)):
            if i > j:
                tem = 0
                for k in range(np.shape(maum_value)[1]):
                    tem = tem + np.fabs(maum_value[i][k] - maum_value[j][k])
                abs_matrix[i][j] = tem
    return abs_matrix

3.最短距离聚类法

寻找矩阵最小值的索引

由于数据预处理得到的结果是一个下三角矩阵,若直接使用np.min找最小值会将0值找出,所以此处我采用较为直接的办法,直接将矩阵的0所由0值变为100。如果有更好的办法,欢迎交流。


 abs_matrix[(abs_matrix == 0)] = 100
 min_arg1 = np.argwhere(abs_matrix == np.min(abs_matrix))[0][0]
 min_arg2 = np.argwhere(abs_matrix == np.min(abs_matrix))[0][1]

计算新类与各类的距离

因为绝对值矩阵的右上边全为100,导致寻找新类与各类矩阵的距离代码实现较为繁琐,所以此处我将下三角矩阵转为对称矩阵。而后只需取出两行在判断每列的最小值(两行的索引就是前面最小值所在的行与列)。最后删除要聚类的两个数据即为新类到各类的距离。


 abs_matrix[(abs_matrix == 100)] = 0
 tem_matrix = np.where(abs_matrix, abs_matrix, abs_matrix.T)

 tem_matrix = tem_matrix[[min_arg1, min_arg2], :]
 new_list = np.min(tem_matrix, axis=0)

 new_list = np.delete(new_list, [min_arg1, min_arg2], axis=0)
 new_list = np.append(new_list, 0)

将名字加入矩阵

由于最后想知道聚类的过程,所以此处我选择将各类的名字加入绝对值矩阵,以便打印信息。


abs_matrix = np.column_stack((name, abs_matrix))

name.insert(0, '0')
abs_matrix = np.row_stack((name, abs_matrix))

name_1 = abs_matrix[min_arg1 + 1, 0]
name_2 = abs_matrix[min_arg2 + 1, 0]
print(f"{name_1}与{name_2}聚为一类,记为{name_1},{name_2}")

删除对应的行和列

根据最短距离聚类法的思想,需要将参与聚类的类从原矩阵中删除。


abs_matrix = np.delete(abs_matrix, [min_arg1 + 1, min_arg2 + 1], axis=0)
abs_matrix = np.delete(abs_matrix, [min_arg1 + 1, min_arg2 + 1], axis=1)

除去矩阵的名字

由于需要计算矩阵的最小值,所以需要将前面加入的名字去除,并将矩阵由字符型转换为浮点型。


 abs_matrix = np.delete(abs_matrix, 0, axis=0)
 abs_matrix = np.delete(abs_matrix, 0, axis=1)
 abs_matrix = abs_matrix.astype("float32")

将新类到各类的距离加入距离矩阵

此处需要将前面得到的新类到各类的距离矩阵中加入一个0,因为自己到自己的距离为0。


 one_list = np.zeros((np.shape(abs_matrix)[0], 1))
 abs_matrix = np.column_stack((abs_matrix, one_list))
 abs_matrix = np.row_stack((abs_matrix, new_list))

处理名字列表

由于代码中需要将名字加入距离矩阵,所以需要删除名字列表中已经聚类的名字,并且需要加入新类的名称。


 name.pop(0)
 name.remove(name_1)
 name.remove(name_2)
 new_name = name_1 + "," + name_2
 name.append(new_name)

设置循环条件

至此算法主要逻辑已经完成,最后只需要根据某个条件重复上述过程即可。很显然,结束条件即最终的距离矩阵大小为1*1时,标志着聚类完成。所以此处我的思路为设置一个标识另其初始值为0,当聚类完成时值变为1。

while biaoshi == 0:
    min_cluster(abs_matrix)

写在后面

由于我对于算法之类的基础知识比较薄弱,所以代码逻辑的思路较为简单。如果读者有更好的思路或者我有什么错误的地方,欢迎交流指正!

Original: https://blog.csdn.net/pretendljj/article/details/123755939
Author: 有态度的Giser
Title: 使用python实现最短距离聚类

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/549914/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【Pandas分组聚合】 groupby()、agg() 方法的使用

    Pandas分组聚合 创建一个dataframe结构 分组函数 groupby() * 初识分组聚合 多重行索引分组聚合 对多列数据进行分组聚合 综合应用 聚合函数 agg(agg…

    人工智能 2023年7月14日
    084
  • Python计算机视觉 图像处理基础:直方图、直方图均衡化、高斯滤波

    文章目录 实验目的 一、灰度变换 * 1.1 灰度图的定义 1.2 彩色图像转灰度图像的方法 1.3 采用convert()方法转换 1.4 代码展示 1.5 结果展示 二、图像轮…

    人工智能 2023年6月20日
    091
  • 树莓派制作语音对话机器人

    树莓派制作语音对话机器人 一、材料准备 二、教程开始 * 1、录音 2、语音识别 3、图灵回复 4、语音合成 5、播放 6、整合 7、运行 一、材料准备 1、树莓派一个2、免驱动U…

    人工智能 2023年5月27日
    0108
  • 基于 Nebula Graph 构建百亿关系知识图谱实践

    本文首发于 Nebula Graph Community 公众号 ; 一、项目背景 微澜是一款用于查询技术、行业、企业、科研机构、学科及其关系的知识图谱应用,其中包含着百亿级的关系…

    人工智能 2023年6月1日
    0111
  • 【speach】语音信号基础

    语音信号处理 语音编码 语音合成 语音识别 说话人识别 语音增强 语音的时域-频域-相位 ; SNR (信噪比) 用分贝(dB)作为度量单位,即:信噪比(dB)= 10 * log…

    人工智能 2023年5月27日
    0118
  • 决策树模型

    本文代码及数据集来自《Python大数据分析与机器学习商业案例实战》 决策树模型的建树依据主要用到的是基尼系数的概念。基尼系数(gini)用于计算一个系统中的失序现象,即系统的混乱…

    人工智能 2023年6月19日
    089
  • DataFrame详解——绘图

    方法解释DataFrame.plot([x, y, kind, ax, …])DataFrame绘图访问器及方法DataFrame.plot.area([x, y])画…

    人工智能 2023年7月7日
    097
  • 用 OpenCV 检测猫脸

    Python中的OpenCV猫脸检测代码 使用 OpenCV 的预训练级联分类器可以轻松检测照片或视频中的猫脸。完成所有工作的代码: import cv2 cascade = cv…

    人工智能 2023年7月19日
    087
  • CAPM模型的应用–回归模型中的Alpha, r_f

    对Alpha的理解: 在市场均衡状态下,CAPM模型中没有α \alpha α ,即α = 0 \alpha = 0 α=0. 但是现实中的OLS回归中标定的α ≠ 0 \alph…

    人工智能 2023年6月17日
    0102
  • 推理机第一记

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    人工智能 2023年6月1日
    0101
  • Win11 22623.891更新了什么?

    Win11 22623.891是微软最近发布的预览版系统,新系统带来了新的功能和改进,下面就和小编一起来看看更新的具体内容吧~欢迎大家下载。 内部版本 22623.891 = 推出…

    人工智能 2023年6月29日
    065
  • Neo4j常见操作及语法功能总结

    Python可以通过安装Python的 -driver包库并使用该包的 数据库。该包提供了连接、查询、插入、更新和删除 数据的API。要连接到 数据库,请使用连接参数和URI。 需…

    人工智能 2023年6月10日
    090
  • 【 YOLO系列v1-v5 原理+代码解读+项目实践】

    【 YOLO系列v1-v5 原理+代码解读+项目实践】 文前白话 * 深度学习目标检测基础知识 原理解析 – YOLO-V1 YOLO-V2 YOLO-V2增加的细节 …

    人工智能 2023年7月11日
    063
  • 目标检测学习

    先进行区推荐再进行目标分类,4个模型从上到下,依次在前者的基础上有所改进 为了获取更多的特征,增加了一个卷积层。SSD对输入图片的大小有要求,必须是3003003,一共输出6张特征…

    人工智能 2023年7月10日
    069
  • ROS机器视觉自学笔记(1)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、ros中安装Opencv 二、使用HSV通道实现目标检测 * 1.HSV颜色通道简介 2. 安…

    人工智能 2023年7月19日
    061
  • Leetcode 1161 最大层内元素和

    给你一个二叉树的根节点  root。设根节点位于二叉树的第 1层,而根节点的子节点位于第 2层,依此类推。 请返回层内元素之和 最大 的那几层(可能只有一层)的层…

    人工智能 2023年6月4日
    076
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球