Настройка плотности ядра 1D - PullRequest
0 голосов
/ 18 марта 2020

Мне нужно разделить одномерный массив для моей задачи. Я нашел KDE как хорошее решение, которое отлично работало для небольших номеров.

    %matplotlib inline
    organHouns = list(dict.fromkeys(organHouns))
    from numpy import array, linspace
    from sklearn.neighbors.kde import KernelDensity
    from matplotlib.pyplot import plot

    a = array(organHouns).reshape(-1, 1)
    kde = KernelDensity(kernel='gaussian', bandwidth=4).fit(a)
    s = linspace(0,50)
    e = kde.score_samples(s.reshape(-1,1))
    plot(s, e)

    from scipy.signal import argrelextrema
    mi, ma = argrelextrema(e, np.less)[0], argrelextrema(e, np.greater)[0]
    print("Minima:", s[mi])
    print("Maxima:", s[ma])

    print(a[a < mi[0]], a[(a >= mi[0]) * (a <= mi[1])], a[a >= mi[1]])

Теперь для большего списка чисел, вроде этого, KDE, похоже, сильно терпит неудачу. Числа, подобные 39, помещаются во второй массив, а числа, такие как 41 и 210, объединяются в третий.

[ 33  29   3  25 -20  16  27  35 -33   0 -26  13  17  14  24  -2  -9  28
  20  -6  -7  21   4 -13  -1  32  18  11  -3 -21 -45 -47  22 -28  -8   7
  31  10   1  36  30 -14  19 -12 -23 -25  -5  23   5  34 -53 -11   6  26
  15   8 -10 -72 -42 -15 -27 -57 -31 -49  12 -30   2 -38   9 -22 -40 -59
 -94 -78]
 
 [38 40 39 37] 
 
 [ 81  79  51  76  80  65  54  77  75  44  56  57  43 124  91  45  48  60
  87  71  67  73  63  89  88  64  78 107  40  62  58  86  82  59  66  61
  84 102  74  68  98  95 121  97  96  85  69  72  93  42  53  50 105 129
 108 113 109  94 123  92 122 111  83  70 112 100  55  52  49 119 125 117
 134 126 118 139 131 149 128 136 156 159 106 133 104 160  47 110 130 142
 115 132 144 141 143 162 135 166 127 152 167 101 103  90 150 140 147 120
 137 138  99 148 146  46 158 155 116 114 154 145 165 153 174 164 177 163
 161 168 151 171 157 169 180 188 182 184 173 176 172 178 170 179 187 190
 181 183 209 193 186 197 202 175 196 189 206 199 207 185 204 200 194 191
  41 195 198 205 222 192 216 211 203 215 208 228 234 227 212 218 210]

Я пытался настроить алгоритм, но я не понимаю, в чем причина. Мне действительно нужны две отдельные данные для устранения шума, и у меня нет большого опыта в методах 1D кластеризации.

...