前言

作业中遇到了需要使用KernelDensity的情况,但是网上的资料参差不齐,找了不短的时间却失望而归,最后还是靠着自己的理解才弄懂sklearn这个函数的使用,特此纪念。


【机器学习sklearn】两个例子轻松搞懂核密度估计KernelDensity

前言

官方文档

官方Sample解读

直方图

核密度

内核可视化

官方实例代码解析:

我的示例

所需文件获取:

题目:

参考答案:(jupyter notebook下环境)

0.导入包

1、数据预处理

2、得到最佳带宽作为真实值(我认为比较合理的方式去选取真实值)

3、开始使用KDE

4,计算估计密度与地面真实密度之间的MSE


官方文档

sklearn.neighbors.KernelDensity官方手册https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KernelDensity.html#sklearn.neighbors.KernelDensity

官方Sample解读

这个例子使用KernelDensity类来演示一维核密度估计的原理。

直方图

下图显示了使用直方图可视化一维点密度的一个问题。直观上,直方图可以被认为是一种方案,其中一个单元“块”堆叠在规则网格上的每个点之上。然而,正如上面的两个面板所显示的那样,对这些块的网格选择可能会导致对密度分布的潜在形状产生截然不同的想法。

        补充:可以看出直方图表达数据密度受带宽的取值影响非常之大,同一个数据不同的带宽完全是两种不同的图性,可见这种方式对于表达密度来讲并不理想。

核密度

如果我们将每个块放在它所代表的点的中心,我们就会得到面板所示的估计值。这是一个带有“大礼帽”核的核密度估计。这个想法可以推广到其他核形状:下图的右下面板显示了相同分布上的高斯核密度估计。

        补充:以每个数据作为中心点设置带宽b,(x-b,x+b)区间范围内存在数据便统计在该柱形图上(这里和微积分的思想有一点类似,把一个不规则形状用无数个无线小的柱形描述他们的面积),这意味着带宽越小,那么数据划分的就越细致,但是也更加尖锐,容易欠拟合;带宽越大,那么数据划分的自然也就较粗糙,但是更加平滑,容易过拟合。

内核可视化

Scikit-learn使用球树或KD树结构,通过内核密度估计器实现高效的内核密度估计。可用的内核显示在本示例的下图中。

        补充:不同的数据分布使用不同的内核,比如符合高斯分布的数据请使用gaussian内核。

官方实例代码解析:

# ----------------------------------------------------------------------
# Plot a 1D density example
# ---------------------------------------------------------------------------
'''
用随机种子生成100个数据,其中30个是符合高斯分布(0,1)的数据,70个是符合高斯分布(5,1)的数据,
(0,1)表示以x轴上的0为中心点,宽度为1的高斯分布。
(5,1)表示以x轴上5为中心店,宽度为1的高斯分布
'''
# ---------------------------------------------------------------------------
N = 100
np.random.seed(1)
X = np.concatenate((np.random.normal(0, 1, int(0.3 * N)), np.random.normal(5, 1, int(0.7 * N)))
)[:, np.newaxis]
# ---------------------------------------------------------------------------# 创建一个[-5,10]范围内包含1000个数据的等差数列
X_plot = np.linspace(-5, 10, 1000)[:, np.newaxis]
# 使用简单的高斯模型norm得到两个高斯分布的概率密度作为真实值(我不觉得这是最佳的办法)
true_dens = 0.3 * norm(0, 1).pdf(X_plot[:, 0]) + 0.7 * norm(5, 1).pdf(X_plot[:, 0])fig, ax = plt.subplots()
# 填充出用简单高斯模型得出的密度真实值
ax.fill(X_plot[:, 0], true_dens, fc="black", alpha=0.2, label="input distribution")
colors = ["navy", "cornflowerblue", "darkorange"]
# 使用不同的内核进行拟合,我也不推荐这样做,我们首先应该是观察数据的分布,然后选择模型,而不是
# 一个个尝试,应该做的是调整我们的带宽。
kernels = ["gaussian", "tophat", "epanechnikov"]
# 划线的粗细
lw = 2for color, kernel in zip(colors, kernels):# 用X数据进行训练模型kde = KernelDensity(kernel=kernel, bandwidth=0.5).fit(X)# 在X_plot数据上测试log_dens = kde.score_samples(X_plot)# 画图ax.plot(X_plot[:, 0],np.exp(log_dens),color=color,lw=lw,linestyle="-",label="kernel = '{0}'".format(kernel),)ax.text(6, 0.38, "N={0} points".format(N))ax.legend(loc="upper left")
# 用'+'代表真实的数据并且画出,用于观察数据分布集中情况
ax.plot(X[:, 0], -0.005 - 0.01 * np.random.random(X.shape[0]), "+k")ax.set_xlim(-4, 9)
ax.set_ylim(-0.02, 0.4)
plt.show()

上诉代码画出的示例图如下:该图比较了一维中100个样本分布的核密度估计。虽然本例使用1D分布,但核密度估计也可以轻松有效地扩展到更高的维度。补充:是有两个符合正态分布的数据叠加而成的。


在此,我更愿意提供一个更加合适的作业帮助大家理解KDE 。

我的示例:

所需文件获取:

百度网盘提取码:q4efhttps://pan.baidu.com/s/1eyyaxF51X4d9hZL_fQOVrA%C2%A0

题目:


        Use the provided dataset, ‘Question_1.csv’, to estimate the density of the dataset using Kernel Density Estimation (KDE). You can consider the Gaussian kernel with three bandwidth
parameters (0.15, 0.5 and 1). The data is generated from a Gaussian distribution with mean 1 and variance 1.
使用提供的数据集“Question_1.csv”,使用核密度估计(KDE)来估计数据集的密度。你可以考虑三个带宽的高斯核参数(0.15,0.5和1)。数据由均值1和方差1的高斯分布生成。

a. Find and report the MSE between the estimated density and the ground truth density?

a.发现并报告估计密度与地面真实密度之间的MSE ?


b. What do you notice as you change the bandwidth parameter and why?

b.修改带宽参数时,您注意到什么?为什么?


参考答案:(jupyter notebook下环境)

0.导入包

# import package
import sklearn
from sklearn.neighbors import KernelDensityfrom scipy.stats import normimport pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom collections import defaultdict

1、数据预处理

# Step1、Data pretreatment
Q1_data = pd.read_csv('hw3/Question_1.csv')
X = np.array(Q1_data['X'].tolist())[:, np.newaxis]
N = len(X)
print('max_value_in_X:{}'.format(max(X)))
print('min_value_inX:{}'.format(min(X)))
X.shape

2、得到最佳带宽作为真实值(我认为比较合理的方式去选取真实值)

# from sklearn.grid_search import GridSearchCV
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import LeaveOneOut
bandwidths = 10 ** np.linspace(-1, 1, 100)
grid = GridSearchCV(KernelDensity(kernel='gaussian'),{'bandwidth': bandwidths},cv=LeaveOneOut())
grid.fit(X)# The best estimated bandwidth density is used as the truth value
best_KDEbandwidth = grid.best_params_['bandwidth']
kernel = "gaussian"
lw = 2
kde = KernelDensity(kernel=kernel, bandwidth=best_KDEbandwidth).fit(X)
truth_density = np.exp(kde.score_samples(X))grid.best_params_

3、开始使用KDE

# Step2、Kernel Density Estimation.
MSE_MAP = defaultdict(list)
fig, ax = plt.subplots()
ax.fill(X[:, 0], truth_density, fc="black", alpha=1, label="truth density")bandwidths = [0.15, 0.5, 1]
colors = ["navy", "cornflowerblue", "darkorange"]
for bandwidth, color in zip(bandwidths, colors): kde = KernelDensity(kernel=kernel, bandwidth=bandwidth).fit(X)log_dens = kde.score_samples(X)if bandwidth == best_KDEbandwidth:bandwidth = 'ground truth'ax.plot(X[:, 0],np.exp(log_dens),color=color,lw=lw,linestyle="-",label="bandwidth = '{0}'".format(bandwidth),)MSE_MAP[bandwidth] = log_densax.text(6, 0.32, "N={0} points".format(N))ax.legend(loc="upper right")
ax.plot(X[:, 0], -0.005 - 0.01 * np.random.random(X.shape[0]), "+k")ax.set_xlim(-4, 9)
ax.set_ylim(-0.02, 0.50)
plt.show()

(预测效果)

4,计算估计密度与地面真实密度之间的MSE

def cal_mse(a, b):if len(a) == len(b):n = len(a)else:return 'len(a) != len(b)'res = 0for i in range(n):res += (a[i]-b[i])**2return res/nfor bandwidth in MSE_MAP:estimate_density = MSE_MAP[bandwidth]MSE = cal_mse(estimate_density, truth_density)print("When bandwidth is {:.2f} ----> MSE(estimate, truth): {:.3f}".format(bandwidth, MSE))
When bandwidth is 0.15 ----> MSE(estimate, truth): 2.603
When bandwidth is 0.50 ----> MSE(estimate, truth): 2.803
When bandwidth is 1.00 ----> MSE(estimate, truth): 3.059

可以看出MSE表示与3.中的图表示出的信息是一致的。

好啦,到此就结束啦!希望本文能帮到你。

如果觉得有用的话,欢迎大家三连~。祝你玩的开心。

【机器学习sklearn】两个例子轻松搞懂核密度估计KernelDensity相关推荐

  1. So easy ! 两句口号轻松搞懂Docker

    作为云计算IT圈里人, 如果还不知道Docker,那就算out啦.不过,在搞懂Docker之前,得先来了解一下Docker的成名之路! 从dotCloud到Docker,一"开"鸣 ...

  2. proe常用c语言语句,带你轻松搞懂Proe条件语句

    原标题:带你轻松搞懂Proe条件语句 本文通过几个简单的例子介绍Proe中的条件语句,希望对你能有所帮助.Proe中使用的IF条件语句和C语言中的IF语句原理是一样的,其结构稍有差别.首先我们了解一下 ...

  3. php service原理,轻松搞懂WebService工作原理

    用更简单的方式给大家谈谈WebService,让你更快更容易理解,希望对初学者有所帮助. WebService是基于网络的.分布式的模块化组件. 我们直接来看WebService的一个简易工作流程: ...

  4. 一个例子彻底搞懂C++的虚函数和纯虚函数

    学习C++的多态性,你必然听过虚函数的概念,你必然知道有关她的种种语法,但你未必了解她为什么要那样做,未必了解她种种行为背后的所思所想.深知你不想在流于表面语法上的蜻蜓点水似是而非,今天我们就一起来揭 ...

  5. 阿里资深软件测试工程师总结的这几点,让你轻松搞懂性能调优

    什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How ...

  6. 灵活例子彻底搞懂reduce

    8个JS的reduce使用实例,和reduce的骚操作 reduce方法是JavaScript中一个比较强大的方法,可能在平时开发中,有人根本没用过,通过下面的8个例子,学会reduce的用法以及它的 ...

  7. 一篇文章 轻松搞懂 AC自动机

    索引 概念 前后缀匹配 Trie树 AC自动机的实现 初始化 Fail指针的构建 匹配字符串 一名蒟蒻向您问好. 概念 这是 AC自动机,不是自动AC机, 是一个十分常用的多模式字符串匹配算法 (也就 ...

  8. 一文轻松搞懂LCD驱动编写

    开发环境: 开发板:JZ2440V3 CPU:samsunS3C2440 内核:Linux3.4.2 编译工具:arm-linux-gcc 4.3.2 LCD:4.3存液晶屏AT043TN24 参考文 ...

  9. 一文带你轻松搞懂事务隔离级别(图文详解)

    本文由 SnailClimb 和读者 BugSpeak 共同完成. 事务隔离级别(图文详解) 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事务最经典也经常被拿出来说例子就是转账了 ...

最新文章

  1. 数学知识--Methods for Non-Linear Least Squares Problems(第二章)
  2. 成功有感之给年轻人的10个忠告
  3. illegal base64 character 3a_双11华硕多款产品再送豪礼 高端硬件通吃最新3A大作
  4. typedef函数指针用法
  5. 雅虎开源CaffeOnSpark:基于Hadoop/Spark的分布式深度学习
  6. 错误请联系管理员文件 index.php,ThinkPHP5框架在写项目过程中遇到的相关问题,以及前端问题-Go语言中文社区...
  7. 【前端开发系列】—— CSS3属性选择器总结
  8. boost::hana::common_t用法的测试程序
  9. 文本搜索 高亮显示
  10. php空间限制磁盘限额,ORA-01536:超出表空间XXXX的空间限额
  11. ASP.NET知识结构
  12. three.js script vertex和fragment在react中使用/纯js写法
  13. http sxyk.cdn_Discuz x3 开启cdn和https后链接修改教程
  14. java反编译工具_Java开发必会的反编译知识(附支持对Lambda进行反编译的工具)...
  15. android无法创建AVD了?
  16. 速达pro服务器显示试用,速达v3-pro商业版突然变成试用版了,加密狗的灯不亮了,是什么原因- _0...
  17. MODI中的OCR模块
  18. 修改无线网密码后服务器拒绝访问,路由器重设密码怎么上不了网
  19. r语言echarts画箱线图_echarter: Echarts的R语言接口
  20. 论文阅读:机器学习模型可解释性方法、应用与安全研究综述

热门文章

  1. 转:充值系列—充值系统数据库设计(一)
  2. 推进中学理化生实验操作考场建设,培养学生的核心素养
  3. 信息化教学大赛 计算机程序设计,信息化教学比赛参赛经验交流会发言稿
  4. android-17手机,覆盖7大手机品牌近4亿安卓用户“互传联盟”让分享更容易
  5. 四面美团,收割 offer
  6. 5G商用后天正式启动,三大运营商5G套餐曝光!
  7. tmd123.com
  8. JSP基础语法--Scriptlet(脚本小程序)
  9. Bootstrap系列之旋转器(Spinners)
  10. 华为OJ(密码强度等级)