Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 6, 2017 10:06:25

Lena13_08
Зарегистрирован: 2017-10-14
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуталась в функциях и структурой Class

У меня структура которая формирует кластеры:

 import numpy as np
class SingleLinkage:
    
    def __init__(self, x, k):
        self.data = x
        n=x.shape[0]
        self.clusters={i : [i] for i in range(n)}
        self.k=k
        self.y=None
     
    def euc(self,x,y):
        self.x=x
        if self.y==None:
            self.y=y 
        return np.sqrt(np.sum((x-y)**2))
    
    def clustDist(self, i, j):
        cd=np.Inf
        for idx in self.clusters[i]:
            for idy in self.clusters[j]:
                cd=min(cd,self.euc(self.data[idx], self.data[idy]))
        return cd
        
    def findClothest(self):
        cd=np.Inf
        for i in self.clusters:
            for j in self.clusters:
                if i!=j and clustDist(i,j)<cd:
                    cc=(i,j)
                    cd=clustDist(i,j)
        #returns the indices of the clothest clusters
    def merge(self,i,j):
        self.clusters[i]+=self.clusters[j]
        self.clusters.pop(j)

Когда я запускаю:
 >>> x = np . array ([[0 , 0] , [0 , 0.1] , [1 , 1]])
>>> hc = lc . SingleLinkage (x , 2)
>>> hc . clusters
Мне отдаёт:
 >>> hc . clusters
{0: [0], 1: [1], 2: [2]}
А должно быть:
 {0: [0 , 1] , 1: [2]}

Отредактировано Lena13_08 (Дек. 6, 2017 14:18:36)

Офлайн

#2 Дек. 6, 2017 16:06:42

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Запуталась в функциях и структурой Class

Lena13_08
ну, что написано, то и возвращает

 self.clusters = {i : [i] for i in range(n)}

как должен формироваться правильный ответ?

Офлайн

#3 Дек. 6, 2017 17:17:38

Lena13_08
Зарегистрирован: 2017-10-14
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуталась в функциях и структурой Class

sander
Lena13_08ну, что написано, то и возвращает

ну так вначале мы задаём кластеры без всяких критерий(тоисть только сколько у нас len(X))
а потом они должны меняться в конце когда мы выщитываем findClothest и складываем их в merge.

ответ как я поняла даёт стартовые позиции:
  >>> hc . clusters
{0: [0], 1: [1], 2: [2]}

а должен
 {0: [0 , 1] , 1: [2]}

просто я постоянно путаюсь в структуре Class

Офлайн

#4 Дек. 6, 2017 19:24:18

papuas
Зарегистрирован: 2015-06-19
Сообщения: 159
Репутация: +  6  -
Профиль   Отправить e-mail  

Запуталась в функциях и структурой Class

sander
Lena13_08
ну, что написано, то и возвращает

self.clusters = {i : for i in range(n)}

Lena13_08
ответ как я поняла даёт стартовые позиции:
>>> hc . clusters
{0: , 1: , 2: }
Вам же sander ясно написал.
Что написано, то и возвращает.

 >>>a = {i: [i] for i in range(3)}
>>>a
{0: [0], 1: [1], 2: [2]}
Метод findClothest если его можно таким назвать, ничего не возвращает, также как и merge и нигде даже не вызывается, а если вы его попробуете вызвать, то выдаст ошибку.
И вообще польза от класса SingleLinkage ровно такая же, как если бы спросили дорогу у прохожих, а вам указали неверное направление.
В общем не ясно как вы хотите добиться желаемого за счет индусского кода.
Также создается впечатление, что вы блокнотом пользуетесь и про авто инспекцию кода не слыхивали.
Короче ошибок тьма и как помочь вам на этом этапе, я не знаю.
Все это выглядит, как будьто вы пытаетесь быстро заговорить на хинди в первый день знакомства с ним не зная грамматики.

Отредактировано papuas (Дек. 6, 2017 21:49:10)

Офлайн

#5 Дек. 6, 2017 22:27:00

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Запуталась в функциях и структурой Class

Лена вы быстро учитесь. Сформулировали что получилось и что хотели. Вы привели рабочий код. Отлично!
Давайте я вам ваш код упрощу.

  import numpy as np
class SingleLinkage:
    def __init__(self, x, k):
        self.clusters={i : [i] for i in range(n)}
x = np . array ([[0 , 0] , [0 , 0.1] , [1 , 1]])
hc = lc . SingleLinkage (x , 2)
hc . clusters

Я выкинул из него все что не запускается и не используется. Теперь понятно почему получается такой hc . clusters?
 >>> hc . clusters
{0: [0], 1: [1], 2: [2]}
Почему должно получиться
 {0: [0 , 1] , 1: [2]}

я не понял, даже гипотез нет. Осталось сформулировать почему он такой должен быть и реализовать это в виде алгоритма.



Отредактировано doza_and (Дек. 6, 2017 22:27:50)

Офлайн

#6 Дек. 7, 2017 22:43:46

Lena13_08
Зарегистрирован: 2017-10-14
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуталась в функциях и структурой Class

papuas
Так в этом и есть проблема я знаю что делают функции в одиночку и зна. что оно не выдаёт ничего.
проблема и есть в том что я могу написать одну функцию за другой но мне нужен Class и я никак не могу погять как слепить всё вместе.
Не понимаю этого ‘self’ даже если прочитала про него на трёх разных языках

Офлайн

#7 Дек. 7, 2017 22:48:54

Lena13_08
Зарегистрирован: 2017-10-14
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуталась в функциях и структурой Class

doza_and
Лена вы быстро учитесь. Сформулировали что получилось и что хотели. Вы привели рабочий код. Отлично!Давайте я вам ваш код упрощу.


я знаю что делают функции в одиночку и знаю что оно не выдаёт ничего.
проблема и есть в том что я могу написать одну функцию за другой но мне нужен Class и я никак не могу понять как слепить всё вместе.

 import numpy as np
class SingleLinkage:
    
    def __init__(self, x, k):
        self.data = x
        n=x.shape[0]
        self.clusters={i : [i] for i in range(n)}
        self.k=k
        self.y=None
     
    def euc(self,x,y):
        self.x=x
        if self.y==None:
            self.y=y 
        return np.sqrt(np.sum((x-y)**2))
    
    def clustDist(self, i, j):
        cd=np.Inf
        for idx in self.clusters[i]:
            for idy in self.clusters[j]:
                cd=min(cd,self.euc(self.data[idx], self.data[idy]))
        return cd
        
    def findClothest(self):
        cd=np.Inf
        for i in self.clusters:
            for j in self.clusters:
                if i!=j and clustDist(i,j)<cd:
                    cc=(i,j)
                    cd=clustDist(i,j)
        return cd
    def merge(self,i,j):
         self.clusters[i]+=self.clusters[j]
         self.clusters.pop(j)
       return self.clusters

self.clusters должны перезаписываться но я не понимаю как это сделать в Class

Офлайн

#8 Дек. 7, 2017 23:18:57

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Запуталась в функциях и структурой Class

Lena13_08
могу написать одну функцию за другой но мне нужен Class
Если вы его не можете его использовать то значит он вам не нужен. Пишите функциями.
Lena13_08
и я никак не могу понять как слепить всё вместе.
Неправда, вы отлично все слепили без синтаксических ошибок.

А в вашем коде по моим оценкам вам никто не поможет. Просто потому что непонятно что вы делаете.

Попробуйте так - напротив каждой строчки кода напишите комментарий зачем вы это написали.

например:
     def euc(self,x,y):      # определяю функцию для .... 
        self.x=x               # не знаю зачем написала self.x вообще нигде не используется
        if self.y==None:   # тут запоминаем первый пришедший y тоже непонятно зачем он тоже не используется
            self.y=y           
        return np.sqrt(np.sum((x-y)**2)) # в конечном итоге функцию не надо было пихать в класс, она с ним делала бесполезные вещи.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version