English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Einleitung in das Algorithmus
Wir hoffen, dass es eine solche Funktion gibt: Sie akzeptiert Eingaben und prediziert die Kategorie, die für die Klassifizierung verwendet wird. Hier wird die sigmoid-Funktion aus der Mathematik verwendet, die spezifische Ausdrucksform und die Funktionsskizze der sigmoid-Funktion sind wie folgt:
Man kann klar erkennen, dass wenn der Eingabewert x kleiner als 0 ist, der Funktionswert < 0 ist.5kategorische Vorhersage wird als 0 klassifiziert; wenn der Eingabewert x größer als 0 ist, ist der Funktionswert > 0.5,kategorische Vorhersage wird als1.
1.1 Darstellung der Vorhersagefunktion
1.2Parameterlösung
Zwei, Implementierung des Codes
die Funktion sigmoid berechnet den entsprechenden Funktionswert; gradAscent implementiert batch-Gradientensteigung bedeutet, dass bei jeder Iteration alle Datensätze berücksichtigt werden; während in stoGradAscent0 alle Beispiele im Datensatz verglichen werden, was die Komplexität erheblich verringert; stoGradAscent1dies ist eine Verbesserung des stochastischen Gradientensteigens, spezifische Änderungen sind, dass die Frequenz der Veränderung von alpha variabel ist und jeder Parameterupdate verwendet zufällig ausgewählte Beispiele.
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 = 15: 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 line in 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 "Es gibt "+str(len(errors))+" Test mit "+str(numIter)+" Durchläufe in allen!" for i in range(numT): print "Der "+str(i+1)+"th"+" testError ist:"+str(errors[i]) print "Durchschnittlicher Testfehler: ", 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)
Zusammenfassung
Das ist der Abschnitt dieses Artikels über klassische Algorithmen des maschinellen Lernens-Vollständige Erklärung des Codes für logistische Regression in Python, hoffentlich hilfreich für alle. Freunde, die interessiert sind, können die Website weiter besuchen:
Implementierung von k in Python-Detaillierte Erklärung des means-Klusteringsalgorithmus
Detaillierte Erklärung der Implementierung des Partikelswarm-Optimierungs-Algorithmus (PSO) in der Python-Programmierung
Detaillierte Erklärung der Implementierung des Ant-Colony-Algorithmus in der Python-Programmierung
Falls es Mängel gibt, freuen wir uns über Ihre Kommentare. Vielen Dank für die Unterstützung unserer Freunde!
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetnutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie urheberrechtlich relevante Inhalte entdecken, freuen wir uns über eine E-Mail an: notice#oldtoolbag.com (Bitte ersetzen Sie # durch @, wenn Sie eine E-Mail senden, um eine Beschwerde einzureichen, und fügen Sie relevante Beweise bei. Sobald die Beschwerde bestätigt wird, wird die Website die fraglichen urheberrechtlichen Inhalte sofort löschen.)