Функция, которая работает вечно - PullRequest
0 голосов
/ 23 октября 2019

У меня проблема с домашним заданием, когда мне нужно объединить несколько функций для получения определенного результата, включающего кластеризацию kmeans.

Вместо использования модуля kleans от sklearn, мы должны объединить некоторые предварительно написанные функции, которые копируют то, что находится «под капотом» модуля kmeans, с нашим собственным калькулятором расстояния сходства косинусов. Я смог найти код, который помог бы собрать калькулятор сходства косинусов ('cosine_sim'), а затем инструктор дал нам код, который выполняет кластеризацию kmeans ('randCent' и 'kmeans'). Все три функции приведены ниже.

Чтобы написать функцию, которая использует эти выходы, я попытался запустить эту функцию kmeans, чтобы увидеть форму / тип выходов, которые она создает. Тем не менее, кажется, работает вечно. Это не удивительно, учитывая, что мои тренировочные данные имеют 2000 строк и 9,328 столбцов (частоты слов). Я дал ему поработать 9-10 часов на ночь, а сегодня утром он все еще работал. Я пытался сделать тренировочный набор меньшего размера - даже один с 5 рядами, и он все еще работает вечно. Я также попробовал его на другом компьютере, но с тем же результатом.

Есть ли проблема в коде (например, застревание в цикле) или это что-то, что для запуска потребуется всего несколько дней? от корки до корки?

TIA за любую помощь.

## Import Modules
from numpy import *
import pandas as pd
from os import chdir
import matplotlib.pyplot as plt
%matplotlib inline

## Cosine distance calculation function (that I found elsewhere)

def cosine_sim (vec1, vec2):
    x_sqr_sum = 0 
    y_sqr_sum = 0
    xy_sum = 0
    for i in range(len(vec1)):
        x = vec1[i] 
        y = vec2[i]
        x_sqr_sum += x*x
        y_sqr_sum += y*y
        xy_sum += x*y
    return xy_sum/sqrt(x_sqr_sum*y_sqr_sum)

##  Function that creates centroids (provided by instructor)

def randCent(dataSet, k):
    n = shape(dataSet)[1]
    centroids = zeros((k,n), dtype=float)
    for j in range(n): #create random cluster centers
        minJ = min(dataSet[:,j])
        rangeJ = float(max(dataSet[:,j]) - minJ)
        centroids[:,j] = minJ + rangeJ * random.rand(k)
    return centroids 

##  Function that performs kMeans clustering (provided by instructor and calls the previous two functions

def kMeans(dataSet, k, distMeas=cosine_sim, createCent=randCent):
    m = shape(dataSet)[0]
    clusterAssment = zeros((m,2))#create mat to assign data points 
                                      #to a centroid, also holds SE of each point
    centroids = createCent(dataSet, k)
    clusterChanged = True
    while clusterChanged:
        clusterChanged = False
        for i in range(m):#for each data point assign it to the closest centroid
            minDist = inf; minIndex = -1
            for j in range(k):
                distJI = distMeas(centroids[j,:],dataSet[i,:])
                if distJI < minDist:
                    minDist = distJI; minIndex = j
            if clusterAssment[i,0] != minIndex: clusterChanged = True
            clusterAssment[i,:] = minIndex,minDist**2
        #print (centroids)
        for cent in range(k):#recalculate centroids
            ptsInClust = dataSet[nonzero(clusterAssment[:,0]==cent)[0]] #get all the point in this cluster - Note: this was incorrect in the original distribution.
            if(len(ptsInClust)!=0):
                centroids[cent,:] = mean(ptsInClust, axis=0)
    return centroids, clusterAssment
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...