超详解DBSCAN聚类算法(含源码)

本文章仅用于学习使用!若有错误之处,欢迎指正!转载请标明出处!!!

DBSCAN聚类算法学习:

  • DBSCAN算法的基本原理:
    超详解DBSCAN聚类算法(含源码)_第1张图片
    超详解DBSCAN聚类算法(含源码)_第2张图片
    超详解DBSCAN聚类算法(含源码)_第3张图片
    超详解DBSCAN聚类算法(含源码)_第4张图片
    超详解DBSCAN聚类算法(含源码)_第5张图片
    超详解DBSCAN聚类算法(含源码)_第6张图片
  • DBSCAN算法实现
    数据集的使用:
    超详解DBSCAN聚类算法(含源码)_第7张图片
    聚类结果及参数对结果的影响:
    超详解DBSCAN聚类算法(含源码)_第8张图片
    超详解DBSCAN聚类算法(含源码)_第9张图片
  • 关于DBSCAN算法的实验
    DBSCAN与K-means聚类的比较:
    超详解DBSCAN聚类算法(含源码)_第10张图片
  • DBSCAN参数设置
    参数对DBCAN聚类结果的影响:
    超详解DBSCAN聚类算法(含源码)_第11张图片
    超详解DBSCAN聚类算法(含源码)_第12张图片
    超详解DBSCAN聚类算法(含源码)_第13张图片
    DBSCAN参数如何自动化确定:
    自动化确定参数的数据集及结果:
    超详解DBSCAN聚类算法(含源码)_第14张图片
    部分代码如下:
    K-means聚类:
# k均值聚类
def KMeans(dataSet, k):
    m = np.shape(dataSet)[0]  # 行的数目
    # 第一列存样本属于哪一簇
    # 第二列存样本的到簇的中心点的误差
    clusterAssment = np.mat(np.zeros((m, 2)))
    clusterChange = True
    # 第1步 初始化centroids
    centroids = randCent(dataSet, k)
    while clusterChange:
        clusterChange = False
        # 遍历所有的样本(行数)
        for i in range(m):
            minDist = 100000.0
            minIndex = -1
            # 遍历所有的质心
            # 第2步 找出最近的质心
            for j in range(k):
                # 计算该样本到质心的欧式距离
                distance = distEclud(centroids[j, :], dataSet[i, :])
                if distance < minDist:
                    minDist = distance
                    minIndex = j
            # 第 3 步:更新每一行样本所属的簇
            if clusterAssment[i, 0] != minIndex:
                clusterChange = True
                clusterAssment[i, :] = minIndex, minDist ** 2
        # 第 4 步:更新质心
        for j in range(k):
            pointsInCluster = dataSet[np.nonzero(clusterAssment[:, 0].A == j)[0]]  # 获取簇类所有的点
            centroids[j, :] = np.mean(pointsInCluster, axis=0)  # 对矩阵的行求均值
    print("Congratulations,cluster complete!")
    return centroids, clusterAssment

DBSCAN聚类:

def dbscan(X, eps, min_Pts):
    k = -1
    NeighborPts = []  # array,某点领域内的对象
    Ner_NeighborPts = []
    fil = []  # 初始时已访问对象列表为空
    gama = [x for x in range(len(X))]  # 初始时将所有点标记为未访问
    cluster = [-1 for y in range(len(X))]
    while len(gama) > 0:
        j = random.choice(gama)
        gama.remove(j)  # 未访问列表中移除
        fil.append(j)  # 添加入访问列表
        NeighborPts = findNeighbor(j, X, eps)
        if len(NeighborPts) < min_Pts:
            cluster[j] = -1  # 标记为噪声点
        else:
            k = k + 1
            cluster[j] = k
            for i in NeighborPts:
                if i not in fil:
                    gama.remove(i)
                    fil.append(i)
                    Ner_NeighborPts = findNeighbor(i, X, eps)
                    if len(Ner_NeighborPts) >= min_Pts:
                        for a in Ner_NeighborPts:
                            if a not in NeighborPts:
                                NeighborPts.append(a)
                    if (cluster[i] == -1):
                        cluster[i] = k
    return cluster

由于代码量较大,不方便全部粘出,详细请看:
源码地址

你可能感兴趣的:(DBSCAN聚类,机器学习)