# Kernel Bandwidth: Why scott's rule only use n**(-1./(d+4)) in scipy.stats

I have a question about bandwidth selection of kernel density estimate in scipy.stats. In the method, if we use Scott's rule, the bandwidth is equal to n**(-1./(d+4)), which means that the bandwidth is only related to the number and dimensions of samples. However, samples with the same n and d can have different variances. Do large unit datas have the same bandwidth as those with small unit? That doesn't make sense, if the data unit is large (large covariance) but the bandwidth is small (n is small), the kernel function can cover almost only one data. As a result, when using n**(-1./(d+4)), should the data be normalized (Z-score) first?

The bandwidth, in my opinion, should be related to the covariance of the data in addition to the n、d, but why is the bandwidth equal to only n**(-1./(d+4))?

• – Tim
Jun 15, 2020 at 6:23

The source says

covariance_factor = scotts_factor
covariance_factor.__doc__ = """Computes the coefficient (kde.factor) that
multiplies the data covariance matrix to obtain the kernel covariance
matrix. The default is scotts_factor.  A subclass can overwrite this
method to provide a different method, or set it through a call to
kde.set_bandwidth."""

That is, the bandwith does depend on the data covarance matrix and scotts_factor is just what you multiply the data covariance matrix by.

• Thanks buddy. Here's another question. I remember the papers saying that the bandwidth is a one-dimensional scalar in the multi-dimensional KDE formula. However, The bandwidth, according to source, should be a d * d dimensional matrix, which is equal to scotts_factor * data_covariance_matrix ? If that's the case, how do I output this d*d dimension matrix ？ Are there any attributes or functions in this api that can capture bandwidth, not just bandwidth coefficients?
– Gid
Jun 15, 2020 at 8:23
• Can I use n**(-1./(d+4)) * data_covariance_matrix to get bandwidth?
– Gid
Jun 15, 2020 at 8:39
• That would be Scott's rule, yes. I don't have any views on whether it's a good approach or not. Jun 15, 2020 at 23:30
• Thanks Thomas. I find that the bandwidth seems to be a covariance matrix, which can be obtained by using kernel.covariance in scipy.stats.gaussian_kde. I also find that kernel.covariance has the following relationship with the covariance of the data: kernel.covariance = kernel.factor**2 * data_covariance kernel.factor = scotts_factor = n**(-1./(d+4)) Now I have another question. I want to know what is the specific formula of Gaussian kernel density estimation based on Scott's rule in scipy.stats.gaussian_kde? i.e. what is the formula of gaussian kernel function?
– Gid
Jun 17, 2020 at 4:03