核密度分析

一.算法介紹

核密度估計(Kernel Density Estimation)是一種用于估計數據分布的非參數統計方法。它可以用于多種目的和應用,包括:

  • 數據可視化:核密度估計可以用來繪制平滑的密度曲線或熱力圖,從而直觀地表示數據的分布情況。它可以幫助我們觀察數據集中的高密度區域、低密度區域以及變化趨勢。
  • 異常檢測:通過核密度估計,我們可以識別數據中的異常點或離群值。異常點通常表現為低密度區域或與其他數據點明顯不同的區域。
  • 概率密度計算:核密度估計可以用于計算給定數值的概率密度。通過將新數據點帶入核密度估計函數,可以估計出該點在數據分布中的密度。
  • 模式識別:核密度估計可以用于識別數據中的模式或聚類。通過觀察密度最高的區域,可以推斷數據的聚類情況或潛在的模式。
  • 預測建模:核密度估計可以用于構建概率模型,進而進行預測。例如,在分類問題中,可以使用核密度估計來估計每個類別的概率密度,然后根據新的數據點所屬的密度來進行分類預測。

根據具體的應用需求,我們可以靈活地使用核密度估計來分析和理解數據集的特征和結構,可能的用途包括針對社區規劃分析房屋密度或犯罪行為,或探索道路或公共設施管線如何影響野生動物棲息地。
每個點位可以設置 weight 字段賦予某些要素比其他要素更大的權重,該字段還允許使用一個點表示多個觀察對象。例如,一個地址可以表示一棟六單元的公寓,或者在確定總體犯罪率時可賦予某些罪行比其他罪行更大的權重。

二.算法計算原理

本算法以四次核函數為基礎,四次核函數的特點是具有平滑的曲線形狀,具有較寬的窗口,對數據點的貢獻在距離較遠時會迅速減小。由于其平滑性和較大的支持范圍,四次核函數在核密度估計中被廣泛使用。

在這里插入圖片描述

在核密度估計中,通過將核函數應用于每個數據點,并對所有數據點的貢獻進行求和,可以計算出在每個位置上的密度估計值。四次核函數的結果可視為在核密度估計中每個位置的密度貢獻權重。較大的結果表示該位置的密度較高,而較小或接近零的結果表示該位置的密度較低。
本算法中主要利用核密度公式計算空間范圍內的核密度值,根據核密度值生成 png 或 jpg 格式的熱力圖,或者將整個空間切割成網格,用網格中心點參與核密度計算生成 geojson 文件,以供進一步空間探索分析。

    /***  計算單個核密度* @param radius 半徑* @param dist 兩點的距離* @param weight 權重* @return*/public static double computeKernel(double radius, double dist, double weight){return  (3 / Math.PI) * weight * Math.pow((1 - Math.pow(dist / radius,2)), 2);}

創新性說明:

  • 1.算法會自適應數據中的空間點位范圍,此范圍可根據參數bufferSize 設置緩沖區擴展,以獲取數據范圍外的點參與計算。
  • 2.根據空間范圍每隔特定步長創建虛擬點位或劃分網格,靈活性較高,步長越小則結果在地圖分布上的精度越高,步長參數step(米) 可選,如果沒有設置, 則默認在空間范圍內自適應創建一百萬左右虛擬點或網格。
  • 3.采用多線程的方式進行核密度計算,速度更快。
  • 4.可將結果值進行歸一化處理,核密度計算出來的結果值主要用于觀察數據分布,但是各個結果值之間相差范圍較大,不易觀察數據分布,歸一化后能更清晰觀察不同區域間的分布情況。
  • 5.可根據核密度值的大小根據不同需求生成熱力圖或 geojson 文件。可在geojson文件上做進一步探索。

三.算法程序

1. 核心流程代碼

從csv中獲取源數據點信息, 獲取坐標范圍,如果需要緩沖區, 則設置緩沖區, 獲取步長長度(默認一百萬個像素點或網格),然后根據核密度信息創建圖片或geojson

        // 輸入文件路徑String inputPath ="D:\\測試數據.csv";// 輸出文件路徑String outPath ="D:\\測試數據.geojson";// String outPath ="D:\\測試數據.jpg";// 經度字段String lonKey = "lon";// 緯度字段String latKey = "lat";// 權重字段String weightKey = "";// 影響半徑double radius = 300.0;// 緩沖區double bufferSize = 0.1;// 生成的網格長度(單位: 米)int step = 0;int type;if (outPath.endsWith("png") || outPath.endsWith("jpg")){type = 0;}else if (outPath.endsWith("geojson")){type = 1;}else {throw new RuntimeException("輸出文件格式只能是 png、jpg 或者 geojson");}// 從csv中獲取源數據點信息List<EntryPoint> entryPoints = EntryPoint.formatToEntryPoints(inputPath, lonKey, latKey, weightKey, radius);// 獲取坐標范圍double[] coordsScope = KernelUtils.getCoordsScope(entryPoints);// 如果需要緩沖區, 則設置緩沖區if (bufferSize != 0){coordsScope = KernelUtils.getBufferScope(coordsScope[0], coordsScope[1], coordsScope[2], coordsScope[3], bufferSize);}// 獲取默認的步長長度, 默認一百萬個像素點或網格if (step ==0){step = KernelUtils.getDefaultSize(coordsScope);}// 根據核密度信息創建圖片或geojsonkernel(coordsScope, entryPoints, step, radius, type, outPath);
    /*** 核密度方法* @param coordsScope 坐標范圍* @param entryPoints  從csv中獲取源數據點信息* @param step 步長長度* @param radius 影響半徑* @param type 輸出文件類型*/public static void kernel(double[] coordsScope, List<EntryPoint> entryPoints, int step, double radius, int type, String path){// 獲取網格坐標系的lon, lat的列表List<Double[]> coords = KernelUtils.getKennelPointCoords(coordsScope[0], coordsScope[1],coordsScope[2],coordsScope[3], step);Progress.progress( progress++);int width =  coords.get(0).length;int high = coords.get(1).length;if (type == 1){// 生產 geojson 網格結果generatorGridGeojson(coords, entryPoints, width-1, high-1, radius, path, step);}else {// 生產熱力圖圖片generatorThermalMap(coords, entryPoints, width, high, radius, path, step);}}

2.創建面的 geojson 文件

    /***  根據核密度信息創建面的 geojson 文件* @param coords 虛擬數據點經緯度列表* @param entryPoints 數據點* @param width 橫向點位數量* @param high 縱向點位數量* @param radius 影響半徑*/public static void generatorGridGeojson(List<Double[]> coords, List<EntryPoint> entryPoints,int width, int high, double radius, String path, int step){// 獲取所有中心點位的數據List<PixelPoint> pixelPoints = KernelUtils.getGridCenters(coords);// 進行核密度計算, 并記錄受到影響的網格信息KernelResult kernelResult = kernelCompute(entryPoints, pixelPoints, width, high, radius);Double[][] matrix = kernelResult.getMatrix();Double max = kernelResult.getMax();Double min = kernelResult.getMin();// 生產面的 geojson 文件writeToFile(KernelUtils.jointGridGeojson(matrix, max, min, coords), path);System.out.println(String.format("計算完成, 生成 geojson 文件, 參與計算網格  %d 個, 受影響網格 %d 個, 相鄰網格間距 %s 米",pixelPoints.size(), KernelUtils.effectiveGrid, step));}

3.熱力圖圖片

    /*** 根據核密度信息創建熱力圖圖片* @param coords 虛擬數據點經緯度列表* @param entryPoints 數據點* @param width 橫向點位數量* @param high 縱向點位數量* @param radius 影響半徑*/public static void generatorThermalMap(List<Double[]> coords, List<EntryPoint> entryPoints,int width, int high, double radius, String path, int step){// 獲得所有點位List<PixelPoint> pixelPoints = KernelUtils.spliceKennelPoints(coords);// 進行核密度計算, 并記錄受到影響的網格信息KernelResult kernelResult = kernelCompute(entryPoints, pixelPoints, width, high, radius);Double[][] matrix = kernelResult.getMatrix();Double max = kernelResult.getMax();Double min = kernelResult.getMin();// 生產熱力圖ImageGenerator.generatorImage(matrix, max, min, path);System.out.println(String.format("計算完成, 生成圖片 像素: %d x  %d, 相鄰像素點實際代表距離 %s 米", width, high, step));}

4.計算所有點位的核密度

    /*** 計算所有點位的核密度* @param entryPoints 數據點信息* @param pixelPoints 創建的虛擬像素點* @param radius 影響半徑* @return*/public static KernelResult kernelCompute(List<EntryPoint> entryPoints, List<PixelPoint> pixelPoints, int width, int high, double radius){List<Double> values = new ArrayList<>();double affectLat = KernelUtils.getLatDist(radius);// 記錄受到影響的網格Double[][] matrix = new Double[high][width];// 建立線程池ThreadPoolExecutor threadPool = new ThreadPoolExecutor(30, 30, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(Integer.MAX_VALUE));// 線程等待計數器CountDownLatch countDownLatch = new CountDownLatch(pixelPoints.size());// 創建鎖, 使計算數據具有線程間可見性Lock lock = new ReentrantLock();int stepPosition = pixelPoints.size() / 75;for (int i = 0; i < pixelPoints.size(); i++){PixelPoint pixelPoint = pixelPoints.get(i);Double kennelLon = pixelPoint.getLon();Double kennelLat = pixelPoint.getLat();threadPool.execute(() -> {// 開始計算每個網格受到其他所有點所影響的核密度double kernel = 0.0;for (int j = 0; j < entryPoints.size(); j++){EntryPoint entryPoint = entryPoints.get(j);double lon = entryPoint.getLon();double lat = entryPoint.getLat();if (Math.abs(lon - kennelLon) > entryPoint.getAffectLon() || Math.abs(lat - kennelLat) > affectLat){continue;}// 獲取權重, 默認為 1.0double weight = 1.0;if (entryPoint.getWeight() != null){weight = entryPoint.getWeight();}// 計算網格中心點與源數據點的距離double distance = KernelUtils.getDistance(lon, lat, kennelLon, kennelLat);// 影響半徑大于距離的點直接去掉if (distance <= radius){// 計算每個網格所受影響的核密度kernel += computeKernel(radius, distance, weight);}}lock.lock();// 為中心點實體類賦予核密度的值Double value = 1 / Math.pow(radius, 2) * kernel;matrix[pixelPoint.getI()][pixelPoint.getJ()] = value;values.add(value);lock.unlock();countDownLatch.countDown();if (countDownLatch.getCount() % stepPosition == 0 && progress < 80){Progress.progress(progress++);}});}// 等待所有任務執行完畢try {countDownLatch.await();} catch (InterruptedException e) {throw new RuntimeException(e);}// 關閉線程池threadPool.shutdown();return  new KernelResult(matrix, Collections.max(values), Collections.min(values));}

5.可執行 jar 包

該程序可打為可執行jar包, 文件夾中的: kernel.jar
運行環境: jdk 1.8

執行示例:

java -jar kernel.jar 杭州市超市營業額.csv 杭州市超市營業額熱力.jpg 經度 緯度 利潤 2000.0 0.1 0
java -jar kernel.jar 杭州市超市營業額.csv 杭州市超市營業額分布.geojson 經度 緯度 利潤 2000.0 0.1 0
java -jar kernel.jar 測試數據.csv 測試數據.jpg lon lat "" 300.0 0.1 0
java -jar kernel.jar 測試數據.csv 測試數據.geojson lon lat "" 300.0 0.1 0
參數參數位置參數說明
inputPath1輸入的csv文件路徑
outPath2輸出的文件路徑,程序根據文件后綴選擇生產的文件類型,只允許 jpg、png、geojson 三種文件。
lonKey3輸入文件中的經度字段名
latKey4輸入文件中的緯度字段名
weightKey5輸入文件中的權重字段名,沒有則輸入””
radius6影響半徑,單位米,影響半徑越長,周圍空間受該數據的影響越廣,需根據不同的輸入數據情況調整
bufferSize7空間緩沖區,可擴大數據空間范圍,一般0.1即可,即擴大 10% 的區域
step8空間劃分步長,步長越小則參與計算的空間點數據越多,計算量越大,結果數據越精確, 需根據不同的輸入數據情況調整,當值為0時,程序則適配生成一百萬個點或網格參與計算,注:盡量不要在城市級別范圍設置過低步長

四.執行結果展示

熱力圖示例:
在這里插入圖片描述

平臺分析示例:

在這里插入圖片描述

杭州市超市營業額區域性分析-熱力圖:

在這里插入圖片描述

杭州市超市營業額區域性分析-平臺分析:
在這里插入圖片描述

五、應用場景

  1. 金融風險評估:核密度算法可以用于評估某種投資方式的風險程度。將歷史數據輸入核密度估計器中,可以得出該投資方式在不同風險水平下的收益概率密度分布。這有助于金融機構更好地了解風險和收益之間的平衡。

  2. 生態學:核密度算法可用于研究動植物的棲息地和遷徙模式。將動植物的觀察數據輸入核密度估計器中,可以得出它們在不同地點出現的概率密度分布,幫助科學家更好地了解動植物的棲息地范圍和活動規律。

  3. 交通流量預測:核密度算法可以用于預測道路上的交通流量。將歷史交通流量數據輸入核密度估計器中,可以得出在不同時間段內和不同位置上的交通流量概率密度分布。這有助于交通管理人員更好地規劃道路、優化路線和管理交通擁堵。

  4. 模式識別:核密度算法可以使用于人臉識別、圖像處理等領域。將輸入數據的特征值輸入核密度估計器中,可以得出不同特征值下相應數據的概率密度分布。這可用于識別圖像中不同物體的特征值,例如人臉的輪廓和眼睛的位置,從而實現自動化識別。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697014.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697014.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697014.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【DOCKER】隨手記

目錄 1. 安裝1.1 LINUX1.2 Windows 2. 常用配置2.1 普通權限運行2.2 開機自啟動2.3 3 更換Docker鏡像源2.4 更改默認存儲位置 3. 顯示帶UI的軟件4. 基于DOCKER的服務4.1 FTP4.2 Portainer4.3 Watchtower4.4 SiYuan4.5 GitLab4.5.1 創建容器4.5.2 克隆路徑問題4.5.3 獲取默認密碼…

win系統下安裝php8.3版本并配置環境變量的詳細教程

本篇文章主要講解在win系統下安裝和配置php8.3版本&#xff0c;并配置環境變量的詳細教程。 日期&#xff1a;2024年2月22日 作者&#xff1a;任聰聰 一、下載php8.3版本包 php8.3版本官方下載地址&#xff1a;https://windows.php.net/download#php-8.3 步驟一、打開下載地址…

【Unity】Unity與安卓交互

問題描述 Unity和安卓手機進行交互&#xff0c;是我們開發游戲中最常見的場景。本教程將從一個簡單的例子來演示一下。 本教程需要用到Android Studio2021.1.1 1.Android Studio新建一個工程 2.選擇Empty Activity 然后點擊Next 3.點擊Finish完成創建 4.選擇File-New-New Mo…

【python 3.9.18】windowns安裝版

因為這個版本官方未提供&#xff0c;所以需要自己編譯出來&#xff0c;其他沒有的版本可以依據下面的進行生成一個exe也可行。 成品&#xff1a; https://gitee.com/greatLong/python-3.9.18/tree/master/python-3.9.18/PCbuild/amd64 1、環境準備 需要使用到 這里面還需要選…

【MATLAB GUI】 5. 圖像處理菜單(菜單編輯器)

看B站up主freexyn的freexyn編程實例視頻教程系列36Matlab GUI的學習筆記 任務要求設計一個圖像處理菜單&#xff0c;實現圖像的打開導入、灰度處理、存儲等功能 修改過文件名&#xff0c;所以運行的時候會有一點點報錯&#xff0c;但是不影響運行 打開工具欄下邊的菜單編輯器…

開窗Window和WindowAll的區別

在 Apache Flink 流處理框架中&#xff0c;窗口操作是處理流數據的重要部分。Flink 提供了時間窗口、計數窗口等多種窗口類型&#xff0c;用于將數據分割成不同的窗口進行聚合或其他處理。 Window 和 WindowAll 是 Flink 中窗口操作的兩種不同方式&#xff0c;它們分別對應不同…

GIT倉庫轉移--攜帶原分支及提交記錄

背景&#xff1a;最近公司倉庫位置需要移動&#xff0c;想保留原有的倉庫分支和提交記錄 操作&#xff1a; 目的位置新建倉庫&#xff08;要保證創建無誤&#xff09;原倉庫 git clone 到本地&#xff0c;git pull 保證代碼最新找到原倉庫.git/config 文件&#xff0c;修改 rem…

EPSON機器人與PC上位機軟件C#網絡TCP通訊

項目背景&#xff1a; 在非標設備PIN焊接機中用到了愛普生機器人。上位機軟件使用c#wpf開發。主要邏輯在上位機中。用愛普生機器人給焊接平臺實現自動上下料。 通訊方式&#xff1a;網絡TCP通訊&#xff0c;Socket 角色&#xff1a;上位機為服務端&#xff0c;機器人為客戶端…

Linux|centos7|錄屏神器asciinema的編譯安裝和離線化安裝使用

前言&#xff1a; asciinema這個錄屏軟件前面有一點研究&#xff0c;但它的部署安裝比較麻煩&#xff0c;雖然此軟件的安裝部署方式是很多的&#xff0c;比如yum安&#xff0c;apt&#xff0c;brew&#xff0c;docker&#xff0c;pip&#xff0c;rust編譯&#xff0c;docker等…

創建一個基于Node.js的實時聊天應用

在當今數字化社會&#xff0c;實時通訊已成為人們生活中不可或缺的一部分。無論是在社交媒體平臺上與朋友交流&#xff0c;還是在工作場合中與同事協作&#xff0c;實時聊天應用都扮演著重要角色。與此同時&#xff0c;Node.js作為一種流行的后端技術&#xff0c;為開發者提供了…

CrossOver虛擬機軟件2024有哪些功能?最新版本支持哪些游戲?

CrossOver由codewaver公司開發的類虛擬機軟件&#xff0c;目的是使linux和Mac OS X操作系統和window系統兼容。CrossOver不像Parallels或VMware的模擬器&#xff0c;而是實實在在Mac OS X系統上運行的一個軟件。CrossOvers能夠直接在Mac上運行Windows軟件與游戲&#xff0c;而不…

Java架構師之路七、大數據:Hadoop、Spark、Hive、HBase、Kafka等

目錄 Hadoop&#xff1a; Spark&#xff1a; Hive&#xff1a; HBase&#xff1a; Kafka&#xff1a; Java架構師之路六、高并發與性能優化&#xff1a;高并發編程、性能調優、線程池、NIO、Netty、高性能數據庫等。-CSDN博客Java架構師之路八、安全技術&#xff1a;Web安…

[前端]開啟VUE之路-NODE.js版本管理

VUE前端開發框架&#xff0c;以Node.js為底座。用歷史性的項目來學習&#xff0c;為了降低開發環境的影響因素&#xff0c;各種版本號最好能一致。前端項目也是一樣。為了項目能夠快速啟動&#xff0c;Node.js的版本管理&#xff0c;可以帶來很大的便利&#xff08;node.js快速…

2023年全年回顧

本年度比較折騰&#xff0c;整體而言可以分為兩個大的階段&#xff0c;簡單而言&#xff0c;轉崗前和轉崗后。 個人收獲 據說程序員有幾大浪漫&#xff0c;比如操作系統、編譯器、瀏覽器、游戲引擎等。 之前參與過游戲引擎&#xff0c;現在有機會參與存儲業務交付&#xff0c…

LangChain支持嗶哩嗶哩視頻總結

是基于LangChain框架下的開發&#xff0c;所以最開始請先 pip install Langchain pip install bilibili-api-python 技術要點&#xff1a; 使用Langchain框架自帶的Document loaders 修改BiliBiliLoader的源碼&#xff0c;自帶的并不支持當前b站的視頻加載 源碼文件修改&a…

如何在 Emacs Prelude 上使用 graphviz 的 dot 繪制流程圖

文章目錄 如何在Emacs Prelude上使用graphviz的dot繪制流程圖 <2022-08-23 周二> 如何在Emacs Prelude上使用graphviz的dot繪制流程圖 標題中的Emacs Prelude是指&#xff1a;bbatsov/prelude&#xff0c;在custom.el中添加即可&#xff1a; ;;; graphviz (prelude-re…

【高德地圖】Android高德地圖繪制標記點Marker

&#x1f4d6;第4章 Android高德地圖繪制標記點Marker ?繪制默認 Marker?繪制多個Marker?繪制自定義 Marker?Marker點擊事件?Marker動畫效果?Marker拖拽事件?繪制默認 Infowindow&#x1f6a9;隱藏InfoWindow 彈框 ?繪制自定義 InfoWindow&#x1f6a9;實現 InfoWindow…

Java 中 CopyOnWriteArrayList和CopyOnWriteArraySet

什么是CopyOnWriteArrayList和CopyOnWriteArraySet CopyOnWriteArrayList和CopyOnWriteArraySet都是Java并發編程中提供的線程安全的集合類。 CopyOnWriteArrayList是一個線程安全的ArrayList&#xff0c;其內部通過volatile數組和顯式鎖ReentrantLock來實現線程安全。它采用…

解決ios17無法復制的問題

原代碼寫過一片js實現復制的代碼 那段代碼有問題 以下是之前寫的一段有問題的原代碼&#xff1a; let url "kkkkkk";const hiddenTextarea document.createElement("textarea");hiddenTextarea.style.position "absolute";hiddenTextarea.st…

ArcgisForJS如何實現添加含圖片樣式的點要素?

文章目錄 0.引言1.加載底圖2.獲取點要素的坐標3.添加含圖片樣式的幾何要素4.完整實現 0.引言 ArcGIS API for JavaScript 是一個用于在Web和移動應用程序中創建交互式地圖和地理空間分析應用的庫。本文在ArcGIS For JavaScript中使用Graphic對象來創建包含圖片樣式的點要素。 …