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()
得到效果图:

更多学习参考
- 什么是核密度估计?如何感性认识?:https://www.zhihu.com/question/27301358
- 非参数估计:核密度估计KDE:https://blog.csdn.net/pipisorry/article/details/53635895