核密度估计(KDE)原理及实现

您所在的位置:网站首页 分布函数常用公式是什么 核密度估计(KDE)原理及实现

核密度估计(KDE)原理及实现

2024-07-12 20:35| 来源: 网络整理| 查看: 265

参数估计指样本数据来自一个具有明确概率密度函数的总体,而在非参数估计中,样本数据的概率分布未知,这时,为了对样本数据进行建模,需要估计样本数据的概率密度函数,核密度估计即是其中一种方式。

引言

统计学中,核密度估计,即Kernel Density Estimation,用以基于有限的样本推断总体数据的分布,因此,核密度估计的结果即为样本的概率密度函数估计,根据该估计的概率密度函数,我们就可以得到数据分布的一些性质,如数据的聚集区域。

从直方图开始

直方图由 Karl Pearson 提出,用以表示样本数据的分布,帮助分析样本数据的众数、中位数等性质,横轴表示变量的取值区间,纵轴表示在该区间内数据出现的频次与区间的长度的比例。

美国人口普查局(The U.S. Census Bureau)调查了 12.4 亿人的上班通勤时间,数据如下:

起点组距频次频次/组距频次/组距/总数0541808360.0067551368727370.02211051861837230.031551963439260.03162051798135960.029255719014380.01163051636932730.026435532126420.005240541228240.0066451592006130.0049603064612150.001790603435570.0005

使用直方图进行数据可视化如下:

Histogram of travel time (to work), US 2000 census. Area under the curve equals the total number of cases. This diagram uses Q/width from the table.

该直方图使用单位间隔的人数(频次/组距)表示为每个矩形的高度,因此每个矩形的面积表示该区间内的人数,矩形的总面积即为 12.4 亿。

而当直方图使用(频次/组距/总数)表示为每个矩形的高度时,数据可视化如下:

Histogram of travel time (to work), US 2000 census. Area under the curve equals 1. This diagram uses Q/total/width from the table.

此时,矩形的面积表示该区间所占的频率,矩形的总面积为 1,该直方图也即频率直方图。

频率直方图有以下特点:

矩形面积为该区间的频率;矩形的高度为该区间的平均频率密度。 概率密度函数

极限思维:我们使用微分思想,将频率直方图的组距一步步减小,随着组距的减小,矩形宽度越来越小,因此,在极限情况下频率直方图就会变成一条曲线,而这条曲线即为概率密度曲线。

对于概率密度曲线,我们知道:随机变量的取值落在某区域内的概率值为概率密度函数在这个区域的积分(见概率密度函数),即: P ( a < x ≤ b ) = ∫ a b f ( x ) d x P(a< x \leq b) = \int\limits_a^b f(x)dx P(a { SDx += Math.pow(pt.lon - avePt.lon, 2); SDy += Math.pow(pt.lat - avePt.lat, 2); }); return Math.sqrt(SDx / pts.length + SDy / pts.length); }

Dm(到平均中心距离的中值):

/** * Dm * @param {Point[]}} pts 所有POI点 * @param {Point} avePt 平均中心 * @returns */ function Dm(pts, avePt) { let distance = []; pts.forEach((pt) => { distance.push(Dist(pt, avePt)); }); distance.sort(); return distance[distance.length / 2]; }

核密度估计:

/** * 核密度估计 * @param {Point[]} pts 所有POI点 * @param {Rect} rect POI点边界 * @param {Number} width 栅格图像宽度 * @param {Number} height 栅格图像高度 */ function kde(pts, rect, width, height) { const estimate = new Array(height) .fill(0) .map(() => new Array(width).fill(0)); let min = Infinity, max = -Infinity; const avePt = ave(pts); const bandWidth = h(pts, avePt); rect.top += bandWidth; rect.bottom -= bandWidth; rect.left -= bandWidth; rect.right += bandWidth; const itemW = (rect.right - rect.left) / width; const itemH = (rect.top - rect.bottom) / height; for (let x = 0; x


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3