具体的な方法が不明なので、的外れな回答になるかもしれませんがコメントします。
KDEを関数として学習させることができれば、任意の点の確率密度が計算できるので、サンプルの件数の差異は気にすることなく比較することが可能です。
参考までに比較するコードを以下に示します。
python
1import numpy as np
2import scipy.stats as stats
3
4np.random.seed(1)
5
6### 元データ
7
8x1 = stats.norm.rvs(loc=1,scale=0.2,size=100)
9y1 = x1*2+stats.norm.rvs(loc=0,scale=0.5,size=100)
10D1 = np.concatenate([x1.reshape([1,100]),y1.reshape([1,100])],axis=0)
11
12### 比較対象データ(その1) 明らかに違うケース
13
14np.random.seed(2)
15
16x2 = stats.norm.rvs(loc=1.5,scale=0.2,size=50)
17y2 = x2**1.2-x2+stats.norm.rvs(loc=0,scale=0.5,size=50)
18D2 = np.concatenate([x2.reshape([1,50]),y2.reshape([1,50])],axis=0)
19
20### 比較対象データ(その2) 元データと同じだが件数を変えたケース
21
22np.random.seed(3)
23
24x3 = stats.norm.rvs(loc=1,scale=0.2,size=50)
25y3 = x3*2+stats.norm.rvs(loc=0,scale=0.5,size=50)
26D3 = np.concatenate([x3.reshape([1,50]),y3.reshape([1,50])],axis=0)
27
28### KDE関数の学習
29
30kde1 = stats.gaussian_kde(D1)
31kde2 = stats.gaussian_kde(D2)
32kde3 = stats.gaussian_kde(D3)
33
34### 確率密度を比較するためのデータ作成
35### 取得したサンプルを使用
36
37test1 = np.concatenate([D1,D2],axis=1)
38test2 = np.concatenate([D1,D3],axis=1)
39
40### 元データと比較対象(その1)をKLダイバージェンスで比較
41
42p = kde1.pdf(test1)
43q = kde2.pdf(test1)
44print(stats.entropy(p, q) )
45
46### 元データと比較対象(その2)をKLダイバージェンスで比較
47
48p = kde1.pdf(test2)
49q = kde3.pdf(test2)
50print(stats.entropy(p, q) )
上記を実行すると、その2のほうが元データの分布に近似していることが示されます。
上記は分布の比較にKLダイバージェンスを用いていますが、他のものでも構わないので、適宜、置き換えてください。また、比較するためのデータですが、上記の場合は手元データをそのまま使用していますが、任意のデータで構いません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。