Добавить метод окна Parzen в мой алгоритм Kmeans - PullRequest
1 голос
/ 23 февраля 2020

Я создал собственный алгоритм 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

Мой код

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)
...