делая наследование класса в качестве аргумента - PullRequest
1 голос
/ 10 марта 2020

Рассмотрим простейший возможный случай, когда мы хотим, чтобы наш класс наследовал от любого класса кластеризации sklearn:

class MyOwnClustering(AgglomerativeClustering):
    def __init__(self,mysetting , **kwargs):
        super().__init__(**kwargs)

Можно ли сделать AgglomerativeClustering в качестве аргумента? Чтобы я мог свободно переключаться с любого кластера на все go (например, Kmeans)?

Редактировать:

Основано на методе 53RT: могу ли я сделать это вместо этого?

def construct_clustering(cls):

    class MyOwnClustering(cls):
        def __init__(self, mysetting , **kwargs):
            super().__init__(**kwargs)

    return MyOwnClustering

Проверено, да, я могу.

1 Ответ

1 голос
/ 10 марта 2020

Я думаю, что ваша проблема может быть решена с помощью шаблона Builder, который демонстрируется здесь .

Это приведет к следующему решению.

from sklearn.cluster import AgglomerativeClustering, KMeans
from sklearn import datasets

setting = dict()
noisy_moons = datasets.make_moons(n_samples=50, noise=.05)

Вы заверните свой создание в функцию

def construct_clustering(cls, setting):

    class MyOwnClustering(cls):
        def __init__(self, mysetting , **kwargs):
            super().__init__(**kwargs)

    clustering = MyOwnClustering(setting)

    return clustering

И может создавать экземпляры MyOwnClustering с различным наследованием

m = construct_clustering(AgglomerativeClustering, setting)
print(isinstance(m, AgglomerativeClustering))

c = m.fit(noisy_moons[0])
c.labels_

>>> array([0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1,
       1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0,
       0, 1, 1, 0, 0, 1], dtype=int64)

m = construct_clustering(KMeans, setting)
print(isinstance(m, KMeans))  # True

c = m.fit(noisy_moons[0])
c.labels_

>>> array([6, 6, 2, 1, 5, 0, 0, 3, 7, 0, 5, 1, 6, 4, 4, 4, 1, 0, 2, 0, 7, 5,
       7, 0, 4, 1, 4, 6, 0, 2, 7, 5, 3, 7, 5, 2, 6, 6, 5, 2, 6, 7, 4, 2,
       4, 3, 3, 3, 0, 1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...