python使用KDE曲线描述频率分布

sklearn KDE文档:https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KernelDensity.html

算法描述

KDE核密度估计,通俗来说,就是用平滑的曲线描述一个序列数据的频率分布直方图。然而在使用频率分布直方图时,要确定每个频率的区间大小,太大则无法反应细微的差距,太小则会是直方图变得毫无意义,因此我们可以通过KDE,从核函数的角度了解这个序列频率的趋势变化,而无需通过阈值确定区间大小。

示例代码

from sklearn.neighbors import KernelDensity
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd


def get_curve_by_kde(array: np.ndarray):
    """计算KDE曲线"""
    model = KernelDensity(bandwidth=1.0, kernel='gaussian')
    model.fit(array[:, np.newaxis])  # 概率分布
    x_range = np.linspace(min(array) - 1, max(array) + 1, len(array))
    # model.score_samples返回的是一个log之后的值,因此需要使用e还原数据
    x_prob = np.exp(model.score_samples(x_range[:, np.newaxis]))
    return x_prob


def main():
    """主流程"""
    x_train = np.hstack((np.random.normal(2, 1, 200), np.random.normal(6, 4, 200)))  # 两个高斯分布组合到一起
    x_prob = get_curve_by_kde(x_train)
    # 展示
    dataframe = pd.DataFrame(data=[x_prob]).T
    dataframe.plot()
    plt.show()


if __name__ == '__main__':
    main()

得到效果图:

在这里插入图片描述

更多学习参考