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

这篇具有很好参考价值的文章主要介绍了【机器学习sklearn】两个例子轻松搞懂核密度估计KernelDensity。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

        作业中遇到了需要使用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类来演示一维核密度估计的原理。

直方图

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

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

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

核密度 

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

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

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

内核可视化 

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

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

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

 官方实例代码解析:

# ----------------------------------------------------------------------
# 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 = 2

for 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分布,但核密度估计也可以轻松有效地扩展到更高的维度。补充:是有两个符合正态分布的数据叠加而成的。

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


在此,我更愿意提供一个更加合适的作业帮助大家理解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 KernelDensity

from scipy.stats import norm

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt

from 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_dens
    
ax.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()

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

(预测效果)

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

def cal_mse(a, b):
    if len(a) == len(b):
        n = len(a)
    else:
        return 'len(a) != len(b)'
    res = 0
    for i in range(n):
        res += (a[i]-b[i])**2
    return res/n
        
for 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.中的图表示出的信息是一致的。

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

如果觉得有用的话,欢迎大家三连~。祝你玩的开心。文章来源地址https://www.toymoban.com/news/detail-420033.html

到了这里,关于【机器学习sklearn】两个例子轻松搞懂核密度估计KernelDensity的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 机器学习--sklearn(决策树)

    机器学习--sklearn(决策树)

    决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。 节点 根节点:没有进边,有出边。包含最初的,针对特征的提问。 中间节点:既有进边也有出边,进

    2023年04月18日
    浏览(8)
  • 机器学习 | sklearn库

    机器学习 | sklearn库

    目录 一、样本及样本的划分 1.1 样本划分 1.2 划分样本的方法 二、导入或创建数据集 2.1 导入sklearn自带的样本数据集 2.2 利用sklearn生成随机的数据集 2.3 读入自己创建的数据集 三、数据预处理 3.1 数据标准化 3.2 sklearn中的数据标准化函数 3.3 正则化函数Normalizer() 四、数据的降

    2024年02月08日
    浏览(6)
  • sklearn机器学习思维导图

    sklearn机器学习思维导图

    2024年01月24日
    浏览(10)
  • 【机器学习基础 3】 sklearn库

    【机器学习基础 3】 sklearn库

    目录 一、sklearn库简介 二、sklearn库安装 三、关于机器学习 四、sklearn库在机器学习中的应用 1、数据预处理 2、特征提取 3、模型选择与评估 五、常用的sklearn函数 1、数据集划分 2、特征选择 3、特征缩放 4、模型训练 5、模型预测         Scikit-learn(简称sklearn)是一个用于

    2024年02月07日
    浏览(9)
  • 机器学习实战:Python基于KDE核密度估计进行分布估计(十六)

    机器学习实战:Python基于KDE核密度估计进行分布估计(十六)

    1.1 KDE简介 核密度估计( Kernel Density Estimation ,简称 KDE )是用于估计连续随机变量概率密度函数的非参数方法。它的工作原理是在每个数据点周围放置一个“ 核 ”(通常是某种平滑的、对称的函数),然后将这些核加起来,形成一个整体的估计。这可以被视为对直方图的平

    2024年02月07日
    浏览(9)
  • 机器学习框架sklearn之随机森林

    集成学习通过建立几个模型组合来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立的学习和作出预测。这些预测最后结合成组合预测,因此优于任何一个单分类的做出预测。 在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是

    2023年04月22日
    浏览(8)
  • 头歌机器学习---sklearn中的kNN算法

    第1关 使用sklearn中的kNN算法进行分类 第2关 使用sklearn中的kNN算法进行回归

    2024年02月06日
    浏览(8)
  • 借助一个例子简要了解机器学习

    借助一个例子简要了解机器学习

    环境: azureml_py boot_size harness_size 0 39 58 1 38 58 2 37 52 3 39 58 4 38 57 5 35 52 6 37 55 7 36 53 8 35 49 9 40 54 10 40 59 11 36 56 12 38 53 13 39 58 14 42 57 15 42 58 16 36 56 17 36 51 18 35 50 19 41 59 20 42 59 21 38 59 22 37 55 23 35 50 24 40 55 25 36 52 26 35 53 27 39 54 28 41 61 29 37 56 30 35 55 31 41 60 32 39 57 33 41 56 34 42 61 35 42 58 36 3

    2024年01月25日
    浏览(8)
  • 【机器学习sklearn】第二节:线性回归和线性分类

    【机器学习sklearn】第二节:线性回归和线性分类

    作者 🕵️‍♂️:让机器理解语言か   专栏 🎇:机器学习sklearn 描述 🎨:本专栏主要分享博主学习机器学习的笔记和一些心得体会。 寄语 💓:🐾没有白走的路,每一步都算数!🐾          监督学习(英语:Supervised learning)是机器学习中最为常见、应用最为广泛的

    2023年04月26日
    浏览(7)
  • 猿创征文|Python-sklearn机器学习之旅:我的第一个机器学习实战项目

    目录 前言 一、从目的出发 1.导入数据 二、项目开启 1.导入数据

    2024年01月24日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包