Мне нужно разделить одномерный массив для моей задачи. Я нашел 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 кластеризации.