English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
uno, resumen del algoritmo
Esperamos que haya una función así: acepta la entrada y predice la categoría, que se utiliza para la clasificación. Aquí, se utiliza la función sigmoid de matemáticas, la expresión específica de la función sigmoid y la imagen de la función se muestran a continuación:
se puede ver claramente que cuando el valor de entrada x es menor que 0, el valor de la función es menor que 0.5,predice la clasificación como 0; cuando el valor de entrada x es mayor que 0, el valor de la función es mayor que 0.5,predice la clasificación como1。
1.1 representación de la función de predicción
1.2resolución de parámetros
dos, implementación del código
la función sigmoid calcula el valor de la función correspondiente; gradAscent implementa batch-ascenso de gradiente, significa que en cada iteración se considera todo el conjunto de datos; mientras que en stoGradAscent0, se compara cada ejemplo del conjunto de datos, reduciendo significativamente la complejidad; stoGradAscent1es una mejora del algoritmo de ascenso de gradiente estocástico, las modificaciones específicas son que la frecuencia de cambio de alpha varía cada vez, y cada vez que se actualizan los parámetros se utilizan ejemplos seleccionados aleatoriamente.
from numpy import * import matplotlib.pyplot as plt def loadDataSet(): dataMat = [] labelMat = [] fr = open('testSet.txt') for line in fr.readlines(): lineArr = line.strip('\n').split('\t') dataMat.append([1.0, float(lineArr[1]) labelMat.append(int(lineArr[2)) fr.close() return dataMat, labelMat def sigmoid(inX): return 1.0/(1+exp(-inX)) def gradAscent(dataMatIn, classLabels): dataMatrix = mat(dataMatIn) labelMat = mat(classLabels).transpose() m,n = shape(dataMatrix) alpha = 0.001 maxCycles = 500 weights = ones((n,1)) errors=[] for k in range(maxCycles): h = sigmoid(dataMatrix*weights) error = labelMat - h errors.append(sum(error)) weights = weights + alpha*dataMatrix.transpose()*error return weights, errors def stoGradAscent0(dataMatIn, classLabels): m,n = shape(dataMatIn) alpha = 0.01 weights = ones(n) for i in range(m): h = sigmoid(sum(dataMatIn[i]*weights)) error = classLabels[i] - h weights = weights + alpha*error*dataMatIn[i] return weights def stoGradAscent1(dataMatrix, classLabels, numIter = 150): m,n = shape(dataMatrix) weights = ones(n) for j in range(numIter): dataIndex = range(m) for i in range(m): alpha = 4/(1.0+j+i)+0.01 randIndex = int(random.uniform(0,len(dataIndex))) h = sigmoid(sum(dataMatrix[randIndex]*weights)) error = classLabels[randIndex]-h weights=weights+alpha*error*dataMatrix[randIndex] del(dataIndex[randIndex]) return weights def plotError(errs): k = len(errs) x = range(1,k+1) plt.plot(x,errs,'g--') plt.show() def plotBestFit(wei): weights = wei.getA() dataMat, labelMat = loadDataSet() dataArr = array(dataMat) n = shape(dataArr)[0] xcord1=[] ycord1=[] xcord2=[] ycord2=[] for i in range(n): if int(labelMat[i])==1: xcord1.append(dataArr[i,1]) ycord1.append(dataArr[i,2]) else: xcord2.append(dataArr[i,1]) ycord2.append(dataArr[i,2]) fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(xcord1, ycord1, s=30, c='red', marker='s') ax.scatter(xcord2, ycord2, s=30, c='green') x = arange(-3.0,3.0,0.1) y=(-weights[0]-weights[1]*x)/weights[2] ax.plot(x,y) plt.xlabel('x1') plt.ylabel('x2') plt.show() def classifyVector(inX, weights): prob = sigmoid(sum(inX*weights)) if prob>0.5: return 1.0 else: return 0 def colicTest(ftr, fte, numIter): frTrain = open(ftr) frTest = open(fte) trainingSet=[] trainingLabels=[] for línea en frTrain.readlines(): currLine = line.strip('\n').split('\t') lineArr=[] for i in range(21]): lineArr.append(float(currLine[i])) trainingSet.append(lineArr) trainingLabels.append(float(currLine[21)) frTrain.close() trainWeights = stoGradAscent1(array(trainingSet),trainingLabels, numIter) errorCount = 0 numTestVec = 0.0 for line in frTest.readlines(): numTestVec += 1.0 currLine = line.strip('\n').split('\t') lineArr=[] for i in range(21]): lineArr.append(float(currLine[i])) if int(classifyVector(array(lineArr), trainWeights))!=int(currLine[21]: errorCount += 1 frTest.close() errorRate = (float(errorCount))/numTestVec return errorRate def multiTest(ftr, fte, numT, numIter): errors=[] for k in range(numT): error = colicTest(ftr, fte, numIter) errors.append(error) print "Hay "+str(len(errors))+" prueba con "+str(numIter)+" iteraciones en total!" for i in range(numT): print "El "+str(i+1)+"th"+" Error de prueba es:"+str(errors[i]) print "Error promedio de prueba: ", float(sum(errors))/len(errors) ''''' data, labels = loadDataSet() weights0 = stoGradAscent0(array(data), labels) weights,errors = gradAscent(data, labels) weights1= stoGradAscent1(array(data), labels, 500) print weights plotBestFit(weights) print weights0 weights00 = [] for w in weights0: weights00.append([w]) plotBestFit(mat(weights00)) print weights1 weights11=[] for w in weights1: weights11.append([w]) plotBestFit(mat(weights11)) ''' multiTest(r"horseColicTraining.txt",r"horseColicTest.txt",10,500)
Resumen
A continuación, se presentan los algoritmos clásicos de aprendizaje automático en este artículo-Detalles completos del código de regresión logística, espero que sea útil para todos. Los amigos interesados pueden continuar consultando nuestro sitio web:
Implementación en Python de k-Implementación detallada del algoritmo de clustering means en Python
Implementación detallada del algoritmo de partículas (PSO) en programación Python
Implementación detallada del algoritmo de hormigas en programación Python
¡Bienvenidos a dejar comentarios sobre deficiencias. ¡Gracias a los amigos por su apoyo a este sitio!
Declaración: El contenido de este artículo se obtiene de la red, es propiedad del autor original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha realizado un procesamiento editorial humano y no asume la responsabilidad de las responsabilidades legales relacionadas. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.