注明:本文主要内容亦曾整理作为本人所选课程《模式识别与机器学习》的期末课程报告。
[问题背景]
关于DBSCAN聚类原理的动画演示,我在B站的投稿《DBSCAN聚类原理 动画演示》中已作了介绍,有兴趣的朋友可以先看一下链接中的1分半钟动画演示。
在[Python数据挖掘] sklearn-DBSCAN聚类一文中,我们调用sklearn库的DBSCAN聚类方法,成功对以下ANSI编码的grade.txt文本文档数据集进行了聚类:
YZN,133,108,76
ZHY,96,145,101
WYZ,132,107,60
DHY,100,102,120
CYH,139,99,93
LHY,73,149,81
ZHY,85,148,93
TQP,39,138,85
ZZL,145,112,71
HJC,101,116,118
XZY,99,98,117
[问题分析]
下面从底层实现的角度,只需用到math库,无需使用numpy,逐步实现DBSCAN聚类算法。
针对grade.txt文本文档进行数据预处理并聚类的实例代码:
(grade.txt需要与代码的.py文件位于同一目录下)
import math
class DBSCAN:
'DBSCAN类'
eps = 0
min_samples = 0
labels_ = []
def __init__(self, eps, min_samples):
self.eps = eps
self.min_samples = min_samples
def distance(self, data1, data2): # 计算距离
distance = 0
for i in range(len(data1)):
distance = distance + pow(data1[i]-data2[i], 2)
distance = math.sqrt(dista