English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
一、算法简要
我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类。这里,用到了数学中的sigmoid函数,sigmoid函数的具体表达式和函数图象如下:
可以较为清楚地看到,当输入的x小于0时,函数值<0.5,将分类预测为0;当输入的x大于0时,函数值>0.5,将分类预测为1。
1.1 预测函数的表示
1.2参数的求解
二、代码实现
函数sigmoid计算相应的函数值;gradAscent实现的batch-梯度上升,意思就是在每次迭代中所有数据集都考虑到了;而stoGradAscent0中,则是将数据集中的示例都比那里了一遍,复杂度大大降低;stoGradAscent1则是对随机梯度上升的改进,具体变化是alpha每次变化的频率是变化的,而且每次更新参数用到的示例都是随机选取的。
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[0]), float(lineArr[1])]) labelMat.append(int(lineArr[2])) fr.close() return dataMat, labelMat تعريف السينويدية(inX): تعود 1.0 / (1 + exp(-inX)) تعريف gradAscent(النقطة_الخامية, classLabels): مصفوفة_النقاط = mat(النقطة_الخامية) مصفوفة_العلامات = mat(classLabels).transpose() m, n = shape(dataMatrix) النسبة_الخامس = 0.001 maxCycles = 500 الوزن = ones((n, 1)) يكون خطأ errors=[] لـ k في rangه(maxCycles): h = السينويدية(مصفوفة_النقاط * الوزن) الخطأ = مصفوفة_العلامات - h الخطأ.append(sum(الخطأ)) الوزن = الوزن + النسبة_الخامس * مصفوفة_النقاط_العكسية.transpose() * الخطأ تعود الوزن, الخطأ تعريف stoGradAscent0(النقطة_الخامية, classLabels): m, n = shape(النقطة_الخامية) النسبة_الخامس = 0.01 الوزن = ones(n) لـ i في rangه(m): h = السينويدية(النقطة_الخامية[i] * الوزن) الخطأ = علامات_الصنف[i] - h الوزن = الوزن + النسبة_الخامس * الخطأ * مصفوفة_النقاط_الخامية[i] return weights تعريف stoGradAscent1(dataMatrix, classLabels, numIter = 150): m, n = shape(dataMatrix) الوزن = ones(n) لـ j في rangه(numIter): النقطة = rangه(m) لـ i في rangه(m): النسبة_الخامس = 4 / (1.0 + j + i) + 0.01 النقطة_العشوائية = int(random.uniform(0, len(النقطة))) h = السينويدية(النقطة_العشوائية * الوزن) الخطأ = علامات_الصنف[النقطة_العشوائية] - h الوزن = الوزن + النسبة_الخامس * الخطأ * مصفوفة_النقاط[النقطة_العشوائية] del(النقطة[النقطة_العشوائية]) 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=[] للمحاور i في rang(21): يضيف lineArr.append(float(currLine[i])) trainingSet.append(lineArr) يضيف trainingLabels.append(float(currLine[21])) يغلق frTrain trainWeights = تصاعددرجات1(array(trainingSet)،trainingLabels، numIter) يكون خطأCount = 0 يكون numTestVec = 0.0 للمحاور line في frTest.readlines(): يضيف numTestVec += 1.0 currLine = line.strip('\n').split('\t') يكون lineArr=[] للمحاور i في rang(21): يضيف lineArr.append(float(currLine[i])) إذا كان int(classifyVector(array(lineArr)،trainWeights))!=int(currLine[21]): يضيف خطأCount += 1 يغلق frTest خطأمعدل = (float(errorCount))/numTestVec يعود خطأمعدل تعريف multiTest(ftr، fte، numT، numIter): يكون خطأ errors=[] للمحاور k في rang(numT): خطأ = اختبارالخيول(ftr، fte، numIter) يضيف خطأ errors.append(error) طبع "هناك "+str(len(errors))+" اختبار مع "+str(numIter)+" تكرارات في الإجمالي!" للمحاور i في rang(numT): طبع "ال"+str(i+1)+"مرةاختبارخطأهـ هو: "+str(errors[i]) طبع "خطأاختبارمتوسط: "،float(الجمع(خطأ))/طول(خطأ) ''''' data،labels = تحميلمجموعةبيانات() وزن0 = تصاعددرجات0(array(data)،labels) وزن،خطأ = تصاعددرجات(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)
الخلاصة
هذا هو محتوى المقال الكامل حول خوارزميات التعلم الآلي الكلاسيكية - تفصيل الشفرة لـ logistic regression، نأمل أن يكون مفيدًا للجميع. يمكن للمهتمين بالاستمرار في مراجعة هذا الموقع:
تفصيل تنفيذ خوارزمية التجميع k-means في Python
تفصيل تنفيذ خوارزمية الجسيمات الذكية (PSO) باستخدام Python
تفصيل تنفيذ خوارزمية الذباب الورقي باستخدام Python
إذا كان هناك نقص، فنرجو منك ترك تعليق. شكرًا للدعم الذي يقدمه الأصدقاء لهذا الموقع!
بيان: محتوى هذا المقال تم جمعه من الإنترنت، ويتمتع صاحب الحقوق الأصلية به، ويتم جمعه من قبل المستخدمين عبر الإنترنت بطرقهم الخاصة، ويتم نشره على هذا الموقع دون امتلاك حقوق الملكية، ولا يتم تعديل المحتوى بشكل إنساني، ولا يتحمل الموقع أي مسؤولية قانونية متعلقة بذلك. إذا رأيت محتوى يشتبه في انتهاك حقوق النسخ، فنرجو منك إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال '#' بـ '@') للإبلاغ، وقدم الدليل اللازم، وإذا تم التحقق من صحة المعلومات، سيتم حذف المحتوى المزعوم فورًا.