def main(alpha): #factorizamos la matriz de entrenamiento nmf = nimfa.Nmf(V_entrenamiento, max_iter=2000, rank=alpha, update='euclidean', objective='fro') nmf_fit = nmf() #extraemos la matriz de bases y caractreristicas W_entrenamiento = np.matrix(nmf_fit.basis()) H_entrenamiento = np.matrix(nmf_fit.coef()) print 'se factorizo la primer matriz' #Obtenemos la matriz V de prueda try: V_prueba = np.loadtxt('matriz_prueba.txt') except IOError: #crear desde cero la matriz V creacion.crearMatriz('prueba') V_prueba = np.loadtxt('matriz_prueba.txt') #sacando la matriz de caractreristicas para el conjunto a clasificar print 'Obteniendo la segunda matriz de caracteristicas del conjunto a clasificar...' a = time.time() H_prueba = np.matrix(np.linalg.inv(W_entrenamiento.transpose()*W_entrenamiento)*(W_entrenamiento.transpose()*V_prueba)) b = time.time() print 'se obtiene la otra matriz de caracteristicas en ', b-a H_lista_prueba, H_lista_entrenamiento = clasificacion_nmfknn(H_prueba, H_entrenamiento) categorias = ['biologia', 'computo','matematicas','medicina', 'derecho','geologia','quimica','astronomia'] pasO = [[i for j in range(15)] for i in categorias] etiquetas_entrenamiento = [] for i in range(len(categorias)): etiquetas_entrenamiento.extend(pasO[i]) pasO = [[i for j in range(3)] for i in categorias] etiquetas_comparar = [] for i in range(len(categorias)): etiquetas_comparar.extend(pasO[i]) numeroClasificar = 24 print 'Comenzando a etiquetar...' a = time.time() etiquetas_euclidianas = aux.comparar(H_lista_prueba , H_lista_entrenamiento, etiquetas_entrenamiento, compa='euc') etiquetas_manhattan = aux.comparar(H_lista_prueba , H_lista_entrenamiento, etiquetas_entrenamiento, compa='man') etiquetas_minkowski = aux.comparar(H_lista_prueba , H_lista_entrenamiento, etiquetas_entrenamiento, compa='min') etiquetas_maxdist = aux.comparar(H_lista_prueba , H_lista_entrenamiento, etiquetas_entrenamiento, compa='max') b = time.time() promedio_e = aux.sacar_mal(etiquetas_euclidianas, etiquetas_comparar) * 100.0 / numeroClasificar promedio_man = aux.sacar_mal(etiquetas_manhattan, etiquetas_comparar) * 100.0 / numeroClasificar promedio_min = aux.sacar_mal(etiquetas_minkowski, etiquetas_comparar) * 100.0 / numeroClasificar promedio_max = aux.sacar_mal(etiquetas_maxdist, etiquetas_comparar) * 100.0 / numeroClasificar print 'con distancia euclidiana hubo un %.3f%s de aciertos' % (promedio_e,'%') print 'con distancia manhattan hubo un %.3f%s de aciertos' % (promedio_man,'%') print 'con distancia minkowski hubo un %.3f%s de aciertos' % (promedio_min,'%') print 'con distancia maxDist hubo un %.3f%s de aciertos' % (promedio_max,'%') print b-a
def clasificacion(): '''clasifica imagenes basado en nmf''' #cargamos las imagenes y las etiquetas de las imagenes print 'Cargando las imagenes...' a = time.time() imagenes_entrenamiento, labels_entrenamiento = load_mnist('training', digits=range(10)) imagenes_prueba, labels_prueba = load_mnist('testing', digits=range(10)) b = time.time() print 'Se cargaron las imagenes en ', b-a numeroEntrenar = 10000 numeroClasificar = 100 #Generamos nuestras matrices V de entrenamiento y V de pruebas unando los numeros definidos arriba print 'Generando matrices V...' a = time.time() V_entrenamiento = aux.generar_v(imagenes_entrenamiento,numeroEntrenar) V_prueba = aux.generar_v(imagenes_prueba, numeroClasificar) b = time.time() print 'Se generaron las matrices V en ', b-a #Generamos las listas con los labels correctos etiquetas_entrenamiento = [labels_entrenamiento[i][0] for i in range(numeroEntrenar)] etiquetas_comparar = [labels_prueba[i][0] for i in range(numeroClasificar)] #factorizamos la matriz de entrenamiento print 'Comenzando a factorizar la matriz de entrenamiento...' a = time.time() nmf = nimfa.Nmf(V_entrenamiento, max_iter=500, rank=20, update='euclidean', objective='fro') nmf_fit = nmf() b = time.time() print 'se factorizo la matriz de entrenamiento en ', b-a #extraemos la matriz de bases y caractreristicas W_entrenamiento = np.matrix(nmf_fit.basis()) H_entrenamiento = np.matrix(nmf_fit.coef()) #sacando la matriz de caractreristicas para el conjunto a clasificar print 'Obteniendo la segunda matriz de caracteristicas del conjunto a clasificar...' a = time.time() H_prueba = np.matrix(np.linalg.inv(W_entrenamiento.transpose()*W_entrenamiento)*(W_entrenamiento.transpose()*V_prueba)) b = time.time() print 'se obtiene la otra matriz de caracteristicas en ', b-a H_lista_prueba = aux.hacer_matriz_lista(H_prueba) H_lista_entrenamiento = aux.hacer_matriz_lista(H_entrenamiento) print 'Comenzando a etiquetar...' etiquetas_euclidianas = aux.comparar(H_lista_prueba , H_lista_entrenamiento, etiquetas_entrenamiento, compa='euc') etiquetas_manhattan = aux.comparar(H_lista_prueba , H_lista_entrenamiento, etiquetas_entrenamiento, compa='man') etiquetas_minkowski = aux.comparar(H_lista_prueba , H_lista_entrenamiento, etiquetas_entrenamiento, compa='min') etiquetas_maxdist = aux.comparar(H_lista_prueba , H_lista_entrenamiento, etiquetas_entrenamiento, compa='max') promedio_e = aux.sacar_mal(etiquetas_euclidianas, etiquetas_comparar) * 100.0 / numeroClasificar promedio_man = aux.sacar_mal(etiquetas_manhattan, etiquetas_comparar) * 100.0 / numeroClasificar promedio_min = aux.sacar_mal(etiquetas_minkowski, etiquetas_comparar) * 100.0 / numeroClasificar promedio_max = aux.sacar_mal(etiquetas_maxdist, etiquetas_comparar) * 100.0 / numeroClasificar print 'con distancia euclidiana hubo un %.3f%s de aciertos' % (promedio_e,'%') print 'con distancia manhattan hubo un %.3f%s de aciertos' % (promedio_man,'%') print 'con distancia minkowski hubo un %.3f%s de aciertos' % (promedio_min,'%') print 'con distancia maxDist hubo un %.3f%s de aciertos' % (promedio_max,'%')