Я создал собственный алгоритм K-средних. И я хочу добавить метод Parzen window к моему алгоритму
(функция ядра K (x) = -x + 1)
Вопрос: Как добавить метод окна Parzen?
Я не нашел примера использования метода Парзена в sklearn. Я прочитал лекцию об этом методе https://www.coursera.org/learn/vvedenie-mashinnoe-obuchenie/lecture/89DSw/mietod-okna-parziena
но как я могу использовать метод в реальном коде?
Я хочу что-то вроде этого
![enter image description here](https://i.stack.imgur.com/3RUzO.png)
Мой код
class KMeans:
def __init__(self, n_clusters=2, metric='euclidean', max_iter=300, dis=0.001):
'''
n_clusters - число кластеров
metric - метрика
max_iter - максимальное число итераций
dis - расстояние между центрами
'''
self.n_clusters = n_clusters
self.metric = metric
self.max_iter = max_iter
self.dis = dis
def distance(self, vector1, vector2):
if self.metric == 'euclidean':
return math.sqrt(pow((vector2-vector1), 2).sum())
if self.metric == 'manhattan':
return abs(vector2 - vector1).sum()
if self.metric == 'chebyshev':
return abs(vector2 - vector1).max()
def predict(self, X):
'''
Предсказываем попадание объектов из X в конкретный кластер
'''
X = np.array(X)
ans = np.zeros((len(X), 1))
for i in range(0,X.shape[0]):
min_dist = self.distance(X[i], self.centers[0])
ans[i] = 0
for j in range(1,self.n_clusters):
if self.distance(X[i],self.centers[j]) < min_dist:
min_dist = self.distance(X[i],self.centers[j])
ans[i] = j
self.labels = ans
return ans
def fit(self, X):
centers = np.zeros((self.n_clusters, X.shape[1]))
X=np.array(X)
for i in range(0,self.n_clusters):
centers[i] = X[math.floor(X.shape[0] * i / self.n_clusters):math.floor(X.shape[0] * (i + 1) / self.n_clusters),:].sum(axis=0) * self.n_clusters / X.shape[0]
'''
Шаг 2 - Выполняем уточнение положения центров кластеров до тех пор, пока
не будет превышено значение max_iter или центры кластеров не будут меняться
'''
for step in range(self.max_iter):
'''
Шаг 2.1 - Вычисляем расстояние до цетров кластеров
Шаг 2.2 - Для каждого объекта находим argmin от расстояний до центров
'''
belong=np.zeros((len(X), 1))
for i in range(0,X.shape[0]):
min = self.distance(X[i],centers[0])
belong[i] = 0
for j in range(1,self.n_clusters):
if self.distance(X[i],centers[j]) < min:
min = self.distance(X[i],centers[j])
belong[i] = j
X_new = np.concatenate((X,belong), axis=1)
'''
Шаг 2.3 - Уточняеням положения центров кластеров
'''
k=0
for i in range(0,self.n_clusters):
a = X_new[X_new[:,X.shape[1]] == i][:,:X.shape[1]].sum(axis=0)/X_new[X_new[:,X.shape[1]] == i].shape[0]
if self.distance(centers[i,:],a)>self.dis:
k=1
centers[i,:] = a
if k==0:
break;
'''
Шаг 3 - Сохраняем положения центров кластеров
'''
self.centers = centers
'''
Шаг 4 - Возвращяем предсказание
'''
return self.predict(X)