Пример #1
0
    def get_objective_function(self):
        clusters = [[] for _ in range(self.c)]
        for key in self.elements.keys():
            clusters[self.elements[key]].append(key)

        energy = 0
        for i in range(self.c):
            k_lim = len(clusters[i])
            for k in range(k_lim):
                energy += (1 - f.gaussian_kernel(
                    self.weights, np.array(self.view.iloc[clusters[i][k]]),
                    np.array(self.prototypes[i])))

        return energy
Пример #2
0
    def optimize_partition(self):
        test = 1
        ite = 0
        while (test):
            ite += 1
            # clusters = [[] for _ in range(self.c)]
            # for key in self.elements.keys():
            # 	clusters[self.elements[key]].append(key)

            #Calculating best prototypes
            self.update_prototypes(self.clusters)
            #calculating hyper parameters
            self.update_weights(self.clusters)

            #Allocating in partitions
            test = 0
            for k in range(self.rows):
                dist = float("inf")
                nearest_cluster = 0
                #Kernel between element and cluster prototype
                for h in range(self.c):
                    x = 2 * (1 - f.gaussian_kernel(
                        self.weights, np.array(self.view.iloc[k]),
                        np.array(self.prototypes[h])))
                    if (x < dist):
                        nearest_cluster = h
                        dist = x

                if (nearest_cluster != self.elements[k]):
                    test = 1
                    nearest_cluster_old = self.elements[k]
                    self.elements[k] = nearest_cluster
                    #Adding to new cluster
                    self.clusters[nearest_cluster].append(k)
                    self.item_to_position[nearest_cluster][k] = len(
                        self.clusters[nearest_cluster]) - 1

                    #Removing from old cluster
                    position = self.item_to_position[nearest_cluster_old].pop(
                        k)
                    last_item = self.clusters[nearest_cluster_old].pop()
                    if position != len(self.clusters[nearest_cluster_old]):
                        self.clusters[nearest_cluster_old][
                            position] = last_item
                        self.item_to_position[nearest_cluster_old][
                            last_item] = position
Пример #3
0
    def update_prototypes(self, clusters):
        for i in range(self.c):
            #Do not fool yourself: Numerator is a vector
            num = 0
            denom = 0
            j_lim = len(clusters[i])
            for j in range(j_lim):
                kernel = f.gaussian_kernel(self.weights,
                                           self.view.iloc[clusters[i][j]],
                                           self.prototypes[i])
                num += kernel * self.view.iloc[clusters[i][j]]
                denom += kernel

            if (denom != 0):
                self.prototypes[i] = num / denom
            else:
                print("denominador igual a zero no update do prototipo!")
Пример #4
0
    def initialize_partitions(self):
        self.elements = {}
        self.clusters = [[] for _ in range(self.c)]
        self.item_to_position = clusters = [{} for _ in range(self.c)]

        for el in range(self.rows):
            dist = float("inf")
            nearest_cluster = 0

            for h in range(self.c):
                #Kernel between element and cluster prototype
                x = 2 * (1 - f.gaussian_kernel(self.weights,
                                               np.array(self.view.iloc[el]),
                                               np.array(self.prototypes[h])))

                if (x < dist):
                    nearest_cluster = h
                    dist = x

            self.elements[el] = nearest_cluster
            self.clusters[nearest_cluster].append(el)
            self.item_to_position[nearest_cluster][el] = len(
                self.clusters[nearest_cluster]) - 1
Пример #5
0
    def update_weights(self, cluster):
        new_weights = self.p * [None]

        vetor_somas = np.zeros(self.p)
        #Calculo denominador
        for h in range(self.p):
            sum_kernels = 0
            for i in range(self.c):
                k_lim = len(cluster[i])
                for k in range(k_lim):
                    #An Element from cluster
                    x_k = np.array(self.view.iloc[cluster[i][k]])
                    #Prototype from cluster
                    g_i = self.prototypes[i]

                    sum_kernels += f.gaussian_kernel(
                        self.weights, x_k,
                        g_i) * (x_k[h] - g_i[h]) * (x_k[h] - g_i[h])

            vetor_somas[h] = sum_kernels

        numerador = (self.gamma**(1 / self.p)) * np.prod(vetor_somas
                                                         **(1 / self.p))
        self.weights = np.divide(numerador, vetor_somas)
Пример #6
0
            marker='o')
plt.plot(xp, yp)
plt.xlim(0, 4.5)
plt.ylim(1.5, 5)
plt.show()

input('Program paused. Press enter to continue.\n')
plt.close()

# ########## Part3: Implementing Gaussian Kernel ##########
print('Evaluating the Gaussian Kernel ...\n')

x1 = np.array([1, 2, 1])
x2 = np.array([0, 4, -1])
sigma = 2
sim = gaussian_kernel(x1, x2, sigma)

print(
    'Gaussian Kernel between x1 = [1; 2; 1], x2 = [0; 4; -1], sigma = {0} :\n'.
    format(sigma),
    '\t{0:.6f}\n(for sigma = 2, this value should be about 0.324652)'.format(
        sim))

input('Program paused. Press enter to continue.\n')
plt.close()

# ########## Part4: Visualizing Dataset 2 ##########
data = sio.loadmat('ex6data2.mat')
X = data['X']  # 863 x 2 matrix
y = data['y']  # 863 x 1 matrix