国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

聚類算法--DBSCAN算法

這篇具有很好參考價值的文章主要介紹了聚類算法--DBSCAN算法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、DBSCAN算法

  1. 簡介

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一個基于密度的聚類算法。算法把簇看作數(shù)據(jù)空間中由低密度區(qū)域分割開的高密度對象區(qū)域;將足夠高密度的區(qū)域劃為簇,可以在有噪音的數(shù)據(jù)集中發(fā)現(xiàn)任意形狀的聚類。
  1. 基本概念

在DBSCAN 算法中有兩個重要的參數(shù):Eps 和 MinPtS。Eps 是定義密度時的鄰域半徑,MinPts 為定義核心點時的閾值。

基于中心定義密度的方法可將點分為三類:

(1)核心點:給定用戶指定閾值MinPts,如果一個點的給定鄰域內(nèi)的點的數(shù)目超過給定閾值MinPts, 那么該點稱為核心點。

(2)邊界點:邊界點不是核心點,但它落在某個核心點的Eps鄰域內(nèi)。

(3)噪聲點:噪聲點既不是核心點,也不是邊界點。

基于密度的簇定義如下:

(1)密度直達:給定一個對象集合D,如果p是在q的鄰域內(nèi),且q是一個核心對象,則稱p從對象q出發(fā)是直接密度直達的。

(2)密度可達:如果存在一個對象鏈 , dbscan聚類算法,算法,聚類,數(shù)據(jù)挖掘,機器學(xué)習(xí),Powered by 金山文檔 ,對于

dbscan聚類算法,算法,聚類,數(shù)據(jù)挖掘,機器學(xué)習(xí),Powered by 金山文檔是從dbscan聚類算法,算法,聚類,數(shù)據(jù)挖掘,機器學(xué)習(xí),Powered by 金山文檔關(guān)于Eps和MinPts直接密度可達的,則對象p是從對象q關(guān)于Eps和MinPts密度可達的。

(3)密度連接:如果對象集D中存在一個對象o,使得對象p和q是從o關(guān)于Eps和MinPts密度可達的,那么對象p和q是關(guān)于Eps和MinPts密度連接的。

(4)密度可達是密度直達的傳遞閉包,這種關(guān)系非對稱的,只有核心對象之間是相互密度直達的。

  1. 算法過程

dbscan聚類算法,算法,聚類,數(shù)據(jù)挖掘,機器學(xué)習(xí),Powered by 金山文檔

通俗的來講,算法流程如下:

(1)將所有數(shù)據(jù)對象標(biāo)記為核心對象、邊界對象或噪聲對象。

(2)刪除噪聲對象。

(3)為距離在Eps之內(nèi)的所有核心對象之間賦予一條邊。

(4)每組聯(lián)通的核心對象形成一個簇。

(5)將每個邊界對象指派到一個與之關(guān)聯(lián)的核心對象的簇中。

二、DBSCAN算法舉例

  1. 案例說明和數(shù)據(jù)

給定一組二維數(shù)據(jù)(x,y)作為點,可以自己定義也可以利用下面的數(shù)據(jù),將數(shù)據(jù)存入文本文檔中,放入相應(yīng)目錄下即可。Eps設(shè)為2,MinPts為3。使用DBSCAN算法進行分類操作。

0,0
0,1
0,2
0,3
0,4
0,5
12,1
12,2
12,3
12,4
12,5
12,6
0,6
0,7
12,7
0,8
0,9
1,1
6,8
8,7
6,7
3,5
  1. 代碼

//定義點類
public class Point {
    private int x;
    private int y;
    private boolean isKey;
    private boolean isClassed;
    public boolean isKey() {
        return isKey;
    }
    public void setKey(boolean isKey) {

        this.isKey = isKey;
        this.isClassed = true;
    }
    public boolean isClassed() {
        return isClassed;
    }
    public void setClassed(boolean isClassed) {

        this.isClassed = isClassed;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public Point() {
        x = 0;
        y = 0;
    }
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public Point(String str) {
        String[] p = str.split(",");
        this.x = Integer.parseInt(p[0]);
        this.y = Integer.parseInt(p[1]);
    }
    public String print() {
        return "(" + this.x + "," + this.y + ")";
    }
}
//對點進行操作
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
public class Utility {


    /**
       * 測試兩個點之間的距離
       * @param p 點
       * @param q 點
       * @return 返回兩個點之間的距離
       */
    public static double getDistance(Point p,Point q){

        int dx=p.getX()-q.getX();
        int dy=p.getY()-q.getY();
        double distance=Math.sqrt(dx*dx+dy*dy);
        return distance;
    }

    /**
       * 檢查給定點是不是核心點
       * @param lst 存放點的鏈表
       * @param p 待測試的點
        * @param e e半徑
       * @param minp 密度閾值
       * @return
       */
    public static List<Point> isKeyPoint(List<Point> lst,Point p,int e,int minp){

        int count=0;
        List<Point> tmpLst=new ArrayList<Point>();
        for (Point q : lst) {
            if (getDistance(p, q) <= e) {
                ++count;
                if (!tmpLst.contains(q)) {
                    tmpLst.add(q);
                }
            }
        }
        if(count>=minp){
            p.setKey(true);
            return tmpLst;
        }
        return null;
    }

    /**
     * 設(shè)置已經(jīng)分類點的標(biāo)志
     * @param lst
     */
    public static void setListClassed(List<Point> lst){

        for (Point p : lst) {
            if (!p.isClassed()) {
                p.setClassed(true);
            }
        }
    }

    /**
     * 如果b中含有a中包含的元素,則把兩個集合合并
     * @param a
     * @param b
     * @return a
     */
    public static boolean mergeList(List<Point> a,List<Point> b){
        boolean merge=false;
        for (Point value : b) {
            if (a.contains(value)) {
                merge = true;
                break;
            }
        }
        if(merge){
            for (Point point : b) {
                if (!a.contains(point)) {
                    a.add(point);
                }
            }
        }
        return merge;
    }

    /**
     * 讀取數(shù)據(jù)
     * @return 返回文本中點的集合
     */
    public static List<Point> getPointsList() throws IOException{
        List<Point> lst=new ArrayList<Point>();
        //String txtPath="D:"+File.separatorChar+"Points.txt";
        String txtPath="E:\\myfile\\Points.txt";
        BufferedReader br=new BufferedReader(new FileReader(txtPath));

        String str="";
        while((str = br.readLine()) != null && !str.equals("")){
            lst.add(new Point(str));
        }
        br.close();
        return lst;
    }
}
//主要算法

import java.io.*;
import java.util.*;

public class DBScan {
    private static List<Point> pointsList = new ArrayList<Point>();// 初始點列表
    private static List<List<Point>> resultList = new ArrayList<List<Point>>();// 分類結(jié)果集
    private static int e = 2;// e半徑
    //private static int e = 2;// e半徑
     private static int minp = 3;// 密度閾值
    //private static int minp = 4;// 密度閾值

    /**
     * 打印結(jié)果
     **/
    private static void display() {
        int index = 1;
        for (List<Point> lst : resultList) {
            if (lst.isEmpty()) {
                continue;
            }
            System.out.println("*****第" + index + "個分類*****");
            for (Point p : lst) {
                System.out.print(p.print());

            }
            System.out.print("\n");
            index++;
        }
    }

    /**
     * 調(diào)用算法
     */
    private static void applyDbscan() {
        try {
            pointsList = Utility.getPointsList();
            for (Point p : pointsList) {
                if (!p.isClassed()) {
                    List<Point> tmpLst = new ArrayList<Point>();
                    if ((tmpLst = Utility.isKeyPoint(pointsList, p, e, minp)) != null) {
                        // 為所有聚類完畢的點做標(biāo)示
                        Utility.setListClassed(tmpLst);
                        resultList.add(tmpLst);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 合并結(jié)果集
     * @return
     */
    private static List<List<Point>> getResult() {
        applyDbscan();// 找到所有直達的聚類
        int length = resultList.size();
        for (int i = 0; i < length; ++i) {
            for (int j = i + 1; j < length; ++j) {
                if (Utility.mergeList(resultList.get(i), resultList.get(j))) {
                    resultList.get(j).clear();
                }
            }
        }
        return resultList;
    }

    /**
     * 程序主函數(shù)
     * @param args
     */
    public static void main(String[] args) {
        getResult();
        display();

    }
}

3.運行結(jié)果

dbscan聚類算法,算法,聚類,數(shù)據(jù)挖掘,機器學(xué)習(xí),Powered by 金山文檔

三、總結(jié)

DBSCAN算法可以對任意形狀的稠密數(shù)據(jù)集進行聚類,相對于K-Means、Mean Shift之類的聚類算法一般只適用于凸數(shù)據(jù)集。除此之外該算法在聚類的同時發(fā)現(xiàn)異常點,對數(shù)據(jù)集中的異常點不敏感。

DBSCAN算法也存著缺點,如果樣本集的密度不均勻、聚類間距差相差很大時,聚類質(zhì)量比較差;樣本集較大時,聚類收斂時間較長;以及對Eps和MinPts的聯(lián)合調(diào)參是比較困難的。

在日常生活中,我們可以根據(jù)數(shù)據(jù)的類型進行合理選擇該算法進行聚類分類。

參考

https://blog.csdn.net/qq_42735631/article/details/120983729

https://zhuanlan.zhihu.com/p/139926467文章來源地址http://www.zghlxwxcb.cn/news/detail-812657.html

到了這里,關(guān)于聚類算法--DBSCAN算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • DBSCAN聚類算法

    DBSCAN聚類算法

    DBSCAN (density-based spatial clustering of applications with noise),即“具有噪聲的基于密度的空間聚類應(yīng)用”。它的原理是識別特征空間的“擁擠”區(qū)域中的點,在這些區(qū)域中許多點靠在一起,這些區(qū)域稱為特征空間中的 密集 區(qū)域。密集區(qū)域最終將有相對較空的區(qū)域分隔開。 在密集區(qū)

    2024年02月06日
    瀏覽(18)
  • DBSCAN聚類算法——MATLAB實現(xiàn)

    DBSCAN聚類算法——MATLAB實現(xiàn)

    ? ? 聲明:本文修改自《 數(shù)學(xué)建模清風(fēng) 》老師的代碼 ???DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一個比較有代表性的基于密度的聚類算法。與劃分和層次聚類方法不同,它將簇定義為密度相連的點的最大集合,能夠把具有足夠高密度的區(qū)域劃分為簇,并可在噪

    2024年02月11日
    瀏覽(17)
  • 密度聚類算法(DBSCAN)實驗案例

    密度聚類算法(DBSCAN)實驗案例

    DBSCAN是一種強大的基于密度的聚類算法,從直觀效果上看,DBSCAN算法可以找到樣本點的全部密集區(qū)域,并把這些密集區(qū)域當(dāng)做一個一個的聚類簇。DBSCAN的一個巨大優(yōu)勢是可以對任意形狀的數(shù)據(jù)集進行聚類。 本任務(wù)的主要內(nèi)容: 1、 環(huán)形數(shù)據(jù)集聚類 2、 新月形數(shù)據(jù)集聚類 3、

    2024年02月08日
    瀏覽(23)
  • 毫米波雷達點云 DBSCAN聚類算法

    毫米波雷達點云 DBSCAN聚類算法

    聚類的目的是將一組數(shù)據(jù)點劃分為具有相似特征或?qū)傩缘慕M或簇。通過聚類分析,我們可以識別出數(shù)據(jù)中的內(nèi)在模式、結(jié)構(gòu)和關(guān)聯(lián)關(guān)系,從而獲得對數(shù)據(jù)的更深入理解。 具體來說,聚類的目的可以分為以下三部分: 發(fā)現(xiàn)數(shù)據(jù)的內(nèi)在結(jié)構(gòu): 聚類可以將數(shù)據(jù)分成簇,這些簇可能

    2024年02月06日
    瀏覽(24)
  • 基于密度的聚類算法(1)——DBSCAN詳解

    基于密度的聚類算法(1)——DBSCAN詳解

    基于密度的聚類算法(1)——DBSCAN詳解 基于密度的聚類算法(2)——OPTICS詳解 基于密度的聚類算法(3)——DPC詳解 1. DBSCAN簡介 DBSCAN(Density-Based Spatial Clustering of Applications with Noise, 具有噪聲的基于密度的聚類方法 )是一種典型的基于密度的空間聚類算法。和K-Means,BIR

    2024年01月24日
    瀏覽(22)
  • 深度解讀DBSCAN聚類算法:技術(shù)與實戰(zhàn)全解析

    深度解讀DBSCAN聚類算法:技術(shù)與實戰(zhàn)全解析

    探索DBSCAN算法的內(nèi)涵與應(yīng)用,本文詳述其理論基礎(chǔ)、關(guān)鍵參數(shù)、實戰(zhàn)案例及最佳實踐,揭示如何有效利用DBSCAN處理復(fù)雜數(shù)據(jù)集,突破傳統(tǒng)聚類限制。 關(guān)注TechLead,分享AI全維度知識。作者擁有10+年互聯(lián)網(wǎng)服務(wù)架構(gòu)、AI產(chǎn)品研發(fā)經(jīng)驗、團隊管理經(jīng)驗,同濟本復(fù)旦碩,復(fù)旦機器人智

    2024年02月05日
    瀏覽(24)
  • C# | DBSCAN聚類算法實現(xiàn) —— 對直角坐標(biāo)系中臨近點的點進行聚類

    C# | DBSCAN聚類算法實現(xiàn) —— 對直角坐標(biāo)系中臨近點的點進行聚類

    聚類算法是一種常見的數(shù)據(jù)分析技術(shù),用于將相似的數(shù)據(jù)對象歸類到同一組或簇中。其中,DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一種基于密度的聚類算法,能夠有效地識別出不同形狀和大小的簇,同時還能標(biāo)識出噪聲數(shù)據(jù)。本篇博客將介紹聚類算法的概念

    2024年02月09日
    瀏覽(36)
  • 數(shù)據(jù)挖掘18大算法實現(xiàn)以及其他相關(guān)經(jīng)典DM算法:決策分類,聚類,鏈接挖掘,關(guān)聯(lián)挖掘,模式挖掘、圖算法,搜索算法等

    數(shù)據(jù)挖掘18大算法實現(xiàn)以及其他相關(guān)經(jīng)典DM算法:決策分類,聚類,鏈接挖掘,關(guān)聯(lián)挖掘,模式挖掘、圖算法,搜索算法等

    【機器學(xué)習(xí)入門與實踐】入門必看系列,含數(shù)據(jù)挖掘項目實戰(zhàn):模型融合、特征優(yōu)化、特征降維、探索性分析等,實戰(zhàn)帶你掌握機器學(xué)習(xí)數(shù)據(jù)挖掘 專欄詳細介紹:【機器學(xué)習(xí)入門與實踐】合集入門必看系列,含數(shù)據(jù)挖掘項目實戰(zhàn):數(shù)據(jù)融合、特征優(yōu)化、特征降維、探索性分析

    2024年02月09日
    瀏覽(51)
  • 【機器學(xué)習(xí)】DBSCAN算法

    參考鏈接: https://blog.csdn.net/haveanybody/article/details/113092851 https://www.jianshu.com/p/dd6ce77bfb8a https://blog.csdn.net/qq_38563206/article/details/120941479 DBSCAN(Density-Based Spatial Clustering of Applica tion with Noise)算法是于1996年提出的一種簡單的、有效的基于密度的聚類算法,該算法利用類的密度連通性

    2024年01月19日
    瀏覽(18)
  • 大數(shù)據(jù)的常用算法(分類、回歸分析、聚類、關(guān)聯(lián)規(guī)則、神經(jīng)網(wǎng)絡(luò)方法、web數(shù)據(jù)挖掘)

    在大數(shù)據(jù)時代,數(shù)據(jù)挖掘是最關(guān)鍵的工作。大數(shù)據(jù)的挖掘是從海量、不完全的、有噪聲的、模糊的、隨機的大型數(shù)據(jù)庫中發(fā)現(xiàn)隱含在其中有價值的、潛在有用的信息和知識的過程,也是一種決策支持過程。其主要基于人工智能,機器學(xué)習(xí),模式學(xué)習(xí),統(tǒng)計學(xué)等。通過對大數(shù)據(jù)

    2024年02月09日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包