IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【无标题】DBSCAN聚类算法(基于密度方法的聚类)java代码(自己造轮子)实现 -> 正文阅读

[人工智能]【无标题】DBSCAN聚类算法(基于密度方法的聚类)java代码(自己造轮子)实现

DBSCAN聚类算法(基于密度方法的聚类)

1、以下图的样本数据为测试数据、不使用java自带的DBSCAN算法进行编写,自行从0开始实现此算法,由于时间紧迫,比较粗糙,100可得60、因代码有太多遍历样本集合以及还有类似递归的调用自身方法的方法,导致代码不够优美,要不是时间太少,肯定是容忍不了的,但同时也有一二优点,比如会下意识的使用解耦,将几个复杂模块分开,然后逐一解决、如图我使用两个方法,和一个main方法,其中hx。。。方法主要处理判断是否能成簇,如果能则返回成簇的集合(即成簇中点的集合),不能则返回null。这样方便main方法和big。。方法获取数据以及让代码看起来优雅一点,big。。方法则是不断判断核心圆中的点是否为核心圆,如果是又调用自身继续判断,直到此簇的所有点都遍历到,其余不做赘述。

请添加图片描述

以此为例:

得java代码:

package bigData;

import java.awt.*;
import java.util.Arrays;

// 思路:我们要将散落的点形成簇,就是寻找点与点之间的密度相连关系。
// 第一步:定义好点的集合,半径,以及最小的圈内点数和准备一个用来输出簇的集合
// 算法思路:
//      1、先遍历集合中的点获得一个核心点。和与之对应的核心圆、将每一个核心点标记,标记后的点可不参与重复的核心点判断
//      2、收集核心圆中的点(除核心点外),因为这些都能成为密度相连的点 存放在 c 集合。
//      3、将 c 集合中的点 看做核心点去判断能否成为核心点、能则重复步骤2,3.不能则代表此簇中的点全部找完,
//      4、继续遍历集合中的点,直至全部遍历,输出存在的簇。
public class Test01 {
    public int[] B=new int[20]; // 存放密度相连的结果集合
    public int ib=0; // 密度相连结果集合的下标

    // 判断点能否成为簇、能返回簇,不能返回null
    public Point[] hxPoint(int[][] A,double r,int a,Point point){

        // 判断是否能成簇,能返回点集合,不能则返回null;
        Point[] points = new Point[20]; // 存储能密度直达的点
        int b=0;

        for (int i=0;i<A.length;i++){
            for (int j =0;j<A[i].length;j++){
                if (A[i][j]>0){
                    if (i==point.x&&j!=point.y) {
                        if (Math.abs(point.y-j)<=r){
                            // 加一,且存入密度直达点的集合中
                            points[b] = new Point(i,j);
                            b++;
                        }
                    }else if (j==point.y&&i!=point.x) {
                        if (Math.abs(point.x - i) <= r) {
                            // 加一,且存入密度直达点的集合中
                            points[b] = new Point(i, j);
                            b++;
                        }
                    }else if (i==point.x&&j==point.y){
                            // 加一,且存入密度直达点的集合中
                            points[b] = new Point(i,j);
                            b++;
                    } else {
                        if ( Math.sqrt(Math.abs((point.x-i)*(point.x-i))+Math.abs((point.y-j)*(point.y-j)))<=r){
                            // 加一,且存入密度直达点的集合中
                            points[b] = new Point(i,j);
                            b++;
                        }
                    }
                }
            }
        }
        Point[] points1 = new Point[b]; // 存储能密度直达的点
        for (int i=0;i<b;i++){
            points1[i] = new Point(points[i].x,points[i].y);
        }
        if (b>=a) return points1;

        return null;

    }

    // 判断哪些点能够密度相连
    public void bigData(int[][] A,double r,int a,Point[] points,Point point1){

        // 我们已知第一次的核心圆中所有点,则遍历点
        for (Point point : points) {
            // 不管是不是核心点都会记录成为密度相连的点
            if ((A[point.x][point.y]>100)) {
                B[ib++] = A[point.x][point.y];
            }

            // 判断点是否为核心点,若为,则继续调用此方法进行遍历,若不为,则放弃。
            // 不管是不是都打上标记(即数值减100)表示后续可跳过此点
            if (A[point.x][point.y] > 100) {
                Point[] points1 = hxPoint(A, r, a, point);
                if (points1 == null ) {
                    // 不为核心点,则标记点
                    A[point.x][point.y] = A[point.x][point.y] - 100;
                } else if (points1 != null) {
                    //为核心点,即能成簇,且没被使用过,则将以此点为核心点的圆中点继续调用此方法,调用前标记点
                    // 直到遍历完所有点。

                    A[point.x][point.y] = A[point.x][point.y] - 100;

                    bigData(A, r, a, points1,point);

                }
            }


        }
    }

    public static void main(String[] args) {
        // 设定A集合的点12个、半径 1、成簇点 4
        // 定义整型二维数组、以0,0为开始,如果坐标上有点则赋值为101、之后的点为102...,第一个1为标志位,1代表未访问。
        int[][] A = new int[][]{ {0,0  ,0  ,0  ,0  ,0  ,0},
                                 {0,0  ,101,0  ,0  ,102,0},
                                 {0,103,104,105,106,107,108},
                                 {0,109,110,0  ,0  ,111,0},
                                 {0,0  ,112,0  ,0  ,0  ,0}};
        double r = 1.0; int a = 4;int c=0;int d=1;

        Test01 test01 = new Test01();
        //先确定一个核心点
        for (int i=0;i<A.length;i++) {
            for (int j = 0; j < A[i].length; j++) {
                // 依次遍历点,直到找核心点,就调用算法计算,计算完后还需继续遍历后续没有被标记的点
                // 遍历的是有值的点

                if (A[i][j] > 100) {

                    Point[] points = test01.hxPoint(A, r, a, new Point(i, j));
                    if (points != null) {
                        // 不管是不是核心点都会记录成为密度相连的点
                        test01.B[test01.ib++] = A[i][j];
                        // 且被标记
                        A[i][j] = A[i][j] - 100;

                        test01.bigData(A, r, a, points,new Point(i, j));
                        System.out.println("此时最终成簇"+(d++)+"的集合为:=======================\n");
                        System.out.print("(");
                        for (int n=c;n<test01.ib;n++) {
                            System.out.print(test01.B[n]+",");
                        }
                        System.out.println(")");
                        c=test01.ib;
                    }
                }
            }
        }
        System.out.println("A集合中的元素为:");
        System.out.println(Arrays.toString(A[0]));
        System.out.println(Arrays.toString(A[1]));
        System.out.println(Arrays.toString(A[2]));
        System.out.println(Arrays.toString(A[3]));
        System.out.println(Arrays.toString(A[4]));

    }
}

结果截图:
请添加图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-04-29 12:08:38  更:2022-04-29 12:12:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:53:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码