本人是一名数学系研究生,于2017年底第一次接触python和机器学习,作为一名新手,欢迎与大家交流。

我主要给大家讲解代码,理论部分给大家推荐3本书:

《机器学习实战中文版》

《机器学习》周志华

《统计学习方法》李航

以上3本书,第一本是基于python2的代码实现;剩余两本主要作为第一本书理论省略部分的补充,理论大部分都讲得很细。

博客上关于机器学习实战理论解释都很多,参差不齐,好作品也大都借鉴了以上3本书,网上有很多电子版的书。

与其看看一些没用的博客,真心不如以上3本书有收获。

说实话,学习一定要静下心来,切忌浮躁。不懂可以每天看一点,每天你懂一点,天天积累就多了。

操作系统:windows8.1

python版本:python3.6

运行环境:spyder(anaconda)

# -*- coding: utf-8 -*-
"""
Created on Wed Feb 28 14:46:29 2018@author: Loulch C.C
"""
#由于本章理论难,所以代码也难,代码相当于是对理论的翻译,有些地方不太好解释,希望大家见谅。import matplotlib.pyplot as plt
from numpy import *                #并不建议这样使用,但有时为了敲代码简单,也可以#读取数据集和类别标
def loadDataSet(fileName):dataMat = []; labelMat = []fr = open(fileName)for line in fr.readlines():                               #逐行读取,滤除空格等lineArr = line.strip().split('\t')dataMat.append([float(lineArr[0]), float(lineArr[1])])#添加数据labelMat.append(float(lineArr[-1]))                   #添加标签return dataMat,labelMatdef showDataSet(dataMat, labelMat):data_plus = []                                  #正样本data_minus = []                                 #负样本for i in range(len(dataMat)):if labelMat[i] > 0:data_plus.append(dataMat[i])else:data_minus.append(dataMat[i])data_plus_np = array(data_plus)              #转换为numpy矩阵data_minus_np = array(data_minus)            #转换为numpy矩阵plt.scatter(data_plus_np.T[0], data_plus_np.T[1],marker='s')   #正样本散点图plt.scatter(data_minus_np.T[0], data_minus_np.T[1]) #负样本散点图plt.show()if __name__ == '__main__':dataMat, labelMat = loadDataSet('testSet.txt')showDataSet(dataMat, labelMat)def selectJrand(i, m):"""函数说明:随机选择alpha_j的索引值Parameters:i - alpha_i的索引值m - alpha参数个数Returns:j - alpha_j的索引值"""j = i                                 #选择一个不等于i的jwhile (j == i):j = int(random.uniform(0, m))return jdef clipAlpha(aj,H,L):"""函数说明:修剪alpha_jParameters:aj - alpha_j的值H - alpha上限L - alpha下限Returns:aj - 修剪后的alpah_j的值"""if aj > H:aj = Hif L > aj:aj = Lreturn aj#简化版SMO算法
def smoSimple(dataMatIn, classLabels, C, toler, maxIter):dataMatrix = mat(dataMatIn); labelMat = mat(classLabels).transpose()b = 0; m,n = shape(dataMatrix)alphas = mat(zeros((m,1)))iter_num = 0while (iter_num < maxIter):alphaPairsChanged = 0for i in range(m):#步骤1:计算误差EifXi = float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[i,:].T)) + bEi = fXi - float(labelMat[i])#优化alpha,更设定一定的容错率。if ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or \((labelMat[i]*Ei > toler) and (alphas[i] > 0)):j = selectJrand(i,m)#步骤1:计算误差EjfXj = float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,:].T)) + bEj = fXj - float(labelMat[j])alphaIold = alphas[i].copy(); alphaJold = alphas[j].copy();#步骤2:计算上下界L和Hif (labelMat[i] != labelMat[j]):L = max(0, alphas[j] - alphas[i])H = min(C, C + alphas[j] - alphas[i])else:L = max(0, alphas[j] + alphas[i] - C)H = min(C, alphas[j] + alphas[i])if L==H: print("L==H"); continue#步骤3:计算etaeta = 2.0 * dataMatrix[i,:]*dataMatrix[j,:].T - \dataMatrix[i,:]*dataMatrix[i,:].T - dataMatrix[j,:]*dataMatrix[j,:].Tif eta >= 0: print("eta>=0"); continue#步骤4:更新alpha_jalphas[j] -= labelMat[j]*(Ei - Ej)/eta#步骤5:修剪alpha_jalphas[j] = clipAlpha(alphas[j],H,L)if (abs(alphas[j] - alphaJold) < 0.00001): print("alpha_j变化太小"); continue#步骤6:更新alpha_ialphas[i] += labelMat[j]*labelMat[i]*(alphaJold - alphas[j])#步骤7:更新b_1和b_2b1 = b - Ei- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[i,:].T\- labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[i,:]*dataMatrix[j,:].Tb2 = b - Ej- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[j,:].T\- labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[j,:]*dataMatrix[j,:].T#步骤8:根据b_1和b_2更新bif (0 < alphas[i]) and (C > alphas[i]): b = b1elif (0 < alphas[j]) and (C > alphas[j]): b = b2else: b = (b1 + b2)/2.0alphaPairsChanged += 1print("第%d次迭代 样本:%d, alpha优化次数:%d" % (iter_num,i,alphaPairsChanged))if (alphaPairsChanged == 0): iter_num += 1else: iter_num = 0print("迭代次数: %d" % iter_num)return b,alphas
""""
def showClassifer(dataMat, w, b):#绘制样本点data_plus = []                                  #正样本data_minus = []                                 #负样本for i in range(len(dataMat)):if labelMat[i] > 0:data_plus.append(dataMat[i])else:data_minus.append(dataMat[i])data_plus_np = array(data_plus)              #转换为numpy矩阵data_minus_np = array(data_minus)            #转换为numpy矩阵plt.scatter(transpose(data_plus_np)[0], transpose(data_plus_np)[1], s=30, alpha=0.7,marker='s')  plt.scatter(transpose(data_minus_np)[0], transpose(data_minus_np)[1], s=30, alpha=0.7)#绘制直线x1 = max(dataMat)[0]x2 = min(dataMat)[0]a1, a2 = wb = float(b)a1 = float(a1[0])a2 = float(a2[0])y1, y2 = (-b- a1*x1)/a2, (-b - a1*x2)/a2plt.plot([x1, x2], [y1, y2])#找出支持向量点for i, alpha in enumerate(alphas):if abs(alpha) > 0:x, y = dataMat[i]plt.scatter([x], [y], s=150, c='none', alpha=0.7, linewidth=1.5, edgecolor='red')plt.show()
"""
def get_w(dataMat, labelMat, alphas):alphas, dataMat, labelMat = array(alphas), array(dataMat), array(labelMat)w = dot((tile(labelMat.reshape(1, -1).T, (1, 2)) * dataMat).T, alphas)return w.tolist()
"""
if __name__ == '__main__':dataMat, labelMat = loadDataSet('testSet.txt')b,alphas = smoSimple(dataMat, labelMat, 0.6, 0.001, 40)w = get_w(dataMat, labelMat, alphas)showClassifer(dataMat, w, b)
"""#完整的Platt SMO算法
class optStruct:"""函数说明:初始化数据结构,维护所有需要操作的值Parameters:dataMatIn - 数据矩阵classLabels - 类别标签C - 惩罚系数toler - 容错率"""def __init__(self, dataMatIn, classLabels, C, toler):self.X = dataMatIn                           #数据矩阵self.labelMat = classLabels                  #类别标签self.C = C                                   #惩罚系数self.tol = toler                             #容错率self.m = shape(dataMatIn)[0]                 #数据矩阵行数self.alphas = mat(zeros((self.m,1)))         #根据矩阵行数初始化alpha参数为0   self.b = 0                                   #初始化b参数为0self.eCache = mat(zeros((self.m,2)))         #根据矩阵行数初始化虎误差缓存,第一列为是否有效的标志位,第二列为实际的误差E的值。
"""
def calcEk(oS, k):fXk = float(multiply(oS.alphas,oS.labelMat).T*(oS.X*oS.X[k,:].T) + oS.b)Ek = fXk - float(oS.labelMat[k])return Ek
"""
def selectJ(i, oS, Ei):"""函数说明:内循环启发方式Parameters:i - 标号为i的数据的索引值oS - 数据结构Ei - 标号为i的数据误差Returns:j, maxK - 标号为j或maxK的数据的索引值Ej - 标号为j的数据误差"""maxK = -1; maxDeltaE = 0; Ej = 0                #初始化值oS.eCache[i] = [1,Ei]                           #首先将输入值Ei在缓存中设置为有效的validEcacheList = nonzero(oS.eCache[:,0].A)[0]  #返回误差不为0的数据的索引值if (len(validEcacheList)) > 1:                  #有不为0的误差for k in validEcacheList:                   #遍历,找到最大的Ekif k == i: continue                     #若k=i,结束本次循环,并开始下一次循环Ek = calcEk(oS, k)                      #计算EkdeltaE = abs(Ei - Ek)                   #计算|Ei-Ek|if (deltaE > maxDeltaE):                #找到maxDeltaEmaxK = k; maxDeltaE = deltaE; Ej = Ekreturn maxK, Ej                             #返回maxK,Ejelse:                                           #初次循环时,采用随机选择alpha_jj = selectJrand(i, oS.m)                    #随机选择alpha_j的索引值Ej = calcEk(oS, j)                          #计算Ejreturn j, Ej                                    #j,Ejdef updateEk(oS, k):"""函数说明:计算Ek,并更新误差缓存Parameters:oS - 数据结构k - 标号为k的数据的索引值Returns:无"""Ek = calcEk(oS, k)                                        #计算EkoS.eCache[k] = [1,Ek]                                    #更新误差缓存
"""
def innerL(i, oS):#步骤1:计算误差EiEi = calcEk(oS, i)#优化alpha,设定一定的容错率。if ((oS.labelMat[i] * Ei < -oS.tol) and (oS.alphas[i] < oS.C)) or\((oS.labelMat[i] * Ei > oS.tol) and (oS.alphas[i] > 0)):j,Ej = selectJ(i, oS, Ei)               #使用内循环启发方式2选择alpha_j,并计算EjalphaIold = oS.alphas[i].copy(); alphaJold = oS.alphas[j].copy(); #步骤2:计算上下界L和Hif (oS.labelMat[i] != oS.labelMat[j]):L = max(0, oS.alphas[j] - oS.alphas[i])H = min(oS.C, oS.C + oS.alphas[j] - oS.alphas[i])else:L = max(0, oS.alphas[j] + oS.alphas[i] - oS.C)H = min(oS.C, oS.alphas[j] + oS.alphas[i])if L == H:print("L==H")return 0#步骤3:计算etaeta = 2.0 * oS.X[i,:] * oS.X[j,:].T - oS.X[i,:] * oS.X[i,:].T - oS.X[j,:] * oS.X[j,:].Tif eta >= 0:print("eta>=0")return 0#步骤4:更新alpha_joS.alphas[j] -= oS.labelMat[j] * (Ei - Ej)/eta#步骤5:修剪alpha_joS.alphas[j] = clipAlpha(oS.alphas[j],H,L)updateEk(oS, j)                             #更新Ej至误差缓存if (abs(oS.alphas[j] - alphaJold) < 0.00001):print("alpha_j变化太小")return 0#步骤6:更新alpha_ioS.alphas[i] += oS.labelMat[j]*oS.labelMat[i]*(alphaJold - oS.alphas[j])updateEk(oS, i)                            #更新Ei至误差缓存#步骤7:更新b_1和b_2b1 = oS.b - Ei- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.X[i,:]*oS.X[i,:].T \- oS.labelMat[j]*(oS.alphas[j]-alphaJold)*oS.X[i,:]*oS.X[j,:].Tb2 = oS.b - Ej- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.X[i,:]*oS.X[j,:].T \- oS.labelMat[j]*(oS.alphas[j]-alphaJold)*oS.X[j,:]*oS.X[j,:].T#步骤8:根据b_1和b_2更新bif (0 < oS.alphas[i]) and (oS.C > oS.alphas[i]): oS.b = b1elif (0 < oS.alphas[j]) and (oS.C > oS.alphas[j]): oS.b = b2else: oS.b = (b1 + b2)/2.0return 1else:return 0
"""
def smoP(dataMatIn, classLabels, C, toler, maxIter,kTup=('lin',0)):"""函数说明:选择第一个alpha值的外循环Parameters:dataMatIn - 数据矩阵classLabels - 数据标签C - 惩罚系数toler - 容错率maxIter - 最大迭代次数Returns:oS.b - SMO算法计算的boS.alphas - SMO算法计算的alphas"""oS = optStruct(mat(dataMatIn), mat(classLabels).transpose(), C, toler,kTup) #初始化数据结构iter = 0                                           #初始化当前迭代次数entireSet = True; alphaPairsChanged = 0while (iter < maxIter) and ((alphaPairsChanged > 0) or (entireSet)):                            #遍历整个数据集都alpha也没有更新或者超过最大迭代次数,则退出循环alphaPairsChanged = 0if entireSet:                                  #遍历整个数据集                           for i in range(oS.m):       alphaPairsChanged += innerL(i,oS)      #使用内循环选择第二个alphaprint("全样本遍历:第%d次迭代 样本:%d, alpha优化次数:%d" % (iter,i,alphaPairsChanged))iter += 1else:                                           #遍历非边界值nonBoundIs = nonzero((oS.alphas.A > 0) * (oS.alphas.A < C))[0] #遍历不在边界0和C的alphafor i in nonBoundIs:alphaPairsChanged += innerL(i,oS)       #使用内循环选择第二个alpha print("非边界遍历:第%d次迭代 样本:%d, alpha优化次数:%d" % (iter,i,alphaPairsChanged))iter += 1if entireSet:                                   #遍历一次后改为非边界遍历entireSet = Falseelif (alphaPairsChanged == 0):          #如果alpha没有更新,计算全样本遍历entireSet = True print("迭代次数: %d" % iter)return oS.b,oS.alphas                       #返回SMO算法计算的b和alphasdef showClassifer(dataMat, classLabels, w, b):"""函数说明:分类结果可视化Parameters:dataMat - 数据矩阵w - 直线法向量b - 直线解决Returns:无"""#绘制样本点data_plus = []                                  #正样本data_minus = []                                 #负样本for i in range(len(dataMat)):if classLabels[i] > 0:data_plus.append(dataMat[i])else:data_minus.append(dataMat[i])data_plus_np = array(data_plus)              #转换为numpy矩阵data_minus_np = array(data_minus)            #转换为numpy矩阵plt.scatter(transpose(data_plus_np)[0], transpose(data_plus_np)[1], s=30, alpha=0.7)plt.scatter(transpose(data_minus_np)[0], transpose(data_minus_np)[1], s=30, alpha=0.7)#绘制直线x1 = max(dataMat)[0]x2 = min(dataMat)[0]a1, a2 = wb = float(b)a1 = float(a1[0])a2 = float(a2[0])y1, y2 = (-b- a1*x1)/a2, (-b - a1*x2)/a2plt.plot([x1, x2], [y1, y2])#找出支持向量点for i, alpha in enumerate(alphas):if abs(alpha) > 0:x, y = dataMat[i]plt.scatter([x], [y], s=150, c='none', alpha=0.7, linewidth=1.5, edgecolor='red')plt.show()def calcWs(alphas,dataArr,classLabels):"""函数说明:计算wParameters:dataArr - 数据矩阵classLabels - 数据标签alphas - alphas值Returns:w - 计算得到的w"""X = mat(dataArr); labelMat = mat(classLabels).transpose()m,n = shape(X)w = zeros((n,1))for i in range(m):w += multiply(alphas[i]*labelMat[i],X[i,:].T)return w
"""
if __name__ == '__main__':dataArr, classLabels = loadDataSet('testSet.txt')b, alphas = smoP(dataArr, classLabels, 0.6, 0.001, 40)w = calcWs(alphas,dataArr, classLabels)showClassifer(dataArr, classLabels, w, b)
"""    #利用核函数对非线性数据进行分类
class optStruct:"""函数说明:初始化数据结构,维护所有需要操作的值Parameters:dataMatIn - 数据集矩阵classLabels - 类别标签C - 惩戒系数toler - 容错率kTup - 包含核函数信息的元组,第一个参数存放核函数类别,第二个参数存放必要的核函数需要用到的参数"""def __init__(self, dataMatIn, classLabels, C, toler, kTup):self.X = dataMatIn                           #数据矩阵self.labelMat = classLabels                  #数据标签self.C = C                                   #松弛变量self.tol = toler                             #容错率self.m = shape(dataMatIn)[0]                 #数据矩阵行数self.alphas = mat(zeros((self.m,1)))         #根据矩阵行数初始化alpha参数为0   self.b = 0                                   #初始化b参数为0self.eCache = mat(zeros((self.m,2)))         #根据矩阵行数初始化虎误差缓存,第一列为是否有效的标志位,第二列为实际的误差E的值。self.K = mat(zeros((self.m,self.m)))         #初始化核Kfor i in range(self.m):                      #计算所有数据的核Kself.K[:,i] = kernelTrans(self.X, self.X[i,:], kTup)def kernelTrans(X, A, kTup):"""函数说明:函数说明:通过核函数将数据转换更高维的空间Parameters:X - 数据矩阵A - 单个数据的向量kTup - 包含核函数信息的元组Returns:K - 计算的核K"""m,n = shape(X)K = mat(zeros((m,1)))if kTup[0] == 'lin': K = X * A.T   #线性核函数,只进行内积。elif kTup[0] == 'rbf':             #高斯核函数,根据高斯核函数公式进行计算for j in range(m):deltaRow = X[j,:] - AK[j] = deltaRow*deltaRow.TK = exp(K/(-1*kTup[1]**2))     #计算高斯核K,kTup[1]就是高斯核函数公式的deltaelse: raise NameError('核函数无法识别')               #报错return K                                             #返回计算的核Kdef calcEk(oS, k):"""函数说明:计算误差Parameters:oS - 数据结构k - 标号为k的数据Returns:Ek - 标号为k的数据误差"""fXk = float(multiply(oS.alphas,oS.labelMat).T*oS.K[:,k] + oS.b)Ek = fXk - float(oS.labelMat[k])return Ekdef innerL(i, oS):"""函数说明:利用启发式方法选择第二个alpha的内循环Parameters:i - 标号为i的数据的索引值oS - 数据结构Returns:1 - 有一对alpha值发生变化0 - 没有一对alpha值发生变化或变化太小"""#步骤1:计算误差EiEi = calcEk(oS, i)#优化alpha,设定一定的容错率。if ((oS.labelMat[i] * Ei < -oS.tol) and (oS.alphas[i] < oS.C)) or\((oS.labelMat[i] * Ei > oS.tol) and (oS.alphas[i] > 0)):j,Ej = selectJ(i, oS, Ei)               #使用内循环启发方式2选择alpha_j,并计算EjalphaIold = oS.alphas[i].copy(); alphaJold = oS.alphas[j].copy(); #步骤2:计算上下界L和Hif (oS.labelMat[i] != oS.labelMat[j]):L = max(0, oS.alphas[j] - oS.alphas[i])H = min(oS.C, oS.C + oS.alphas[j] - oS.alphas[i])else:L = max(0, oS.alphas[j] + oS.alphas[i] - oS.C)H = min(oS.C, oS.alphas[j] + oS.alphas[i])if L == H:print("L==H")return 0#步骤3:计算etaeta = 2.0 * oS.K[i,j] - oS.K[i,i] - oS.K[j,j]if eta >= 0:print("eta>=0")return 0#步骤4:更新alpha_joS.alphas[j] -= oS.labelMat[j] * (Ei - Ej)/eta#步骤5:修剪alpha_joS.alphas[j] = clipAlpha(oS.alphas[j],H,L)updateEk(oS, j)                             #更新Ej至误差缓存if (abs(oS.alphas[j] - alphaJold) < 0.00001):print("alpha_j变化太小")return 0#步骤6:更新alpha_ioS.alphas[i] += oS.labelMat[j]*oS.labelMat[i]*(alphaJold - oS.alphas[j])updateEk(oS, i)                            #更新Ei至误差缓存#步骤7:更新b_1和b_2b1 = oS.b - Ei- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.K[i,i]\- oS.labelMat[j]*(oS.alphas[j]-alphaJold)*oS.K[i,j]b2 = oS.b - Ej- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.K[i,j]\- oS.labelMat[j]*(oS.alphas[j]-alphaJold)*oS.K[j,j]#步骤8:根据b_1和b_2更新bif (0 < oS.alphas[i]) and (oS.C > oS.alphas[i]): oS.b = b1elif (0 < oS.alphas[j]) and (oS.C > oS.alphas[j]): oS.b = b2else: oS.b = (b1 + b2)/2.0return 1else:return 0def testRbf(k1 = 1.3):"""函数说明:测试函数Parameters:k1 - 使用高斯核函数的时候表示到达率Returns:无"""dataArr,labelArr = loadDataSet('testSetRBF.txt')              #加载训练集b,alphas = smoP(dataArr, labelArr, 200, 0.0001, 100, ('rbf', k1)) #根据训练集计算b和alphasdatMat = mat(dataArr); labelMat = mat(labelArr).transpose()svInd = nonzero(alphas.A > 0)[0]     #利用nonzero函数获得非负alpha的索引值,进而得到支持向量sVs = datMat[svInd]              #通过索引获得支持向量所对应的样本                                       labelSV = labelMat[svInd];       #通过索引获得支持向量所对应的类别标签print("支持向量个数:%d" % shape(sVs)[0])m,n = shape(datMat)errorCount = 0for i in range(m):kernelEval = kernelTrans(sVs,datMat[i,:],('rbf', k1))    #计算各个点的核predict = kernelEval.T * multiply(labelSV,alphas[svInd]) + b     #根据支持向量的点,计算超平面,返回预测结果if sign(predict) != sign(labelArr[i]): errorCount += 1        #返回数组中各元素的正负符号,用1和-1表示,并统计错误个数c1=(float(errorCount)/m)*100print("训练集错误率: %.2f%%" % c1)             #打印错误率dataArr,labelArr = loadDataSet('testSetRBF2.txt')            #加载测试集errorCount = 0datMat = mat(dataArr); labelMat = mat(labelArr).transpose()         m,n = shape(datMat)for i in range(m):kernelEval = kernelTrans(sVs,datMat[i,:],('rbf', k1))    #计算各个点的核           predict=kernelEval.T *multiply(labelSV,alphas[svInd]) + b         #根据支持向量的点,计算超平面,返回预测结果if sign(predict) != sign(labelArr[i]): errorCount += 1       #返回数组中各元素的正负符号,用1和-1表示,并统计错误个数c2=(float(errorCount)/m)*100print("测试集错误率: %.2f%%" % c2)             #打印错误率return [c1,c2]def showDataSet(dataMat, labelMat):"""函数说明:数据可视化Parameters:dataMat - 数据矩阵labelMat - 数据标签Returns:无"""data_plus = []                                  #正样本data_minus = []                                 #负样本for i in range(len(dataMat)):if labelMat[i] > 0:data_plus.append(dataMat[i])else:data_minus.append(dataMat[i])data_plus_np = array(data_plus)              #转换为numpy矩阵data_minus_np = array(data_minus)            #转换为numpy矩阵plt.scatter(transpose(data_plus_np)[0], transpose(data_plus_np)[1])   #正样本散点图plt.scatter(transpose(data_minus_np)[0], transpose(data_minus_np)[1]) #负样本散点图plt.show()
"""
if __name__=='__main__':testRbf()#showDataSet(dataMat, labelMat)
"""
def multiTest():numTests = 10; errorSum1=0.0;errorSum2=0.0for k in range(numTests):errorSum1+=float(testRbf()[0])errorSum2+=float(testRbf()[1])print ("在%d次迭代后训练集的错误率是: %.2f%%" % (numTests, errorSum1/float(numTests)))print ("在%d次迭代后测试集的错误率是: %.2f%%" % (numTests, errorSum2/float(numTests)))
"""
if __name__=='__main__':multiTest()
"""    #基于SVM的数字识别
def img2vector(filename):"""函数说明:将32x32的二进制图像转换为1x1024向量。Parameters:filename - 文件名Returns:returnVect - 返回的二进制图像的1x1024向量"""returnVect = zeros((1,1024))fr = open(filename)for i in range(32):lineStr = fr.readline()for j in range(32):returnVect[0,32*i+j] = int(lineStr[j])return returnVectdef loadImages(dirName):"""函数说明:加载图片Parameters:dirName - 文件夹的名字Returns:trainingMat - 数据矩阵hwLabels - 数据标签"""from os import listdirhwLabels = []trainingFileList = listdir(dirName)           m = len(trainingFileList)trainingMat = zeros((m,1024))for i in range(m):fileNameStr = trainingFileList[i]fileStr = fileNameStr.split('.')[0]     classNumStr = int(fileStr.split('_')[0])if classNumStr == 9: hwLabels.append(-1)else: hwLabels.append(1)trainingMat[i,:] = img2vector('%s/%s' % (dirName, fileNameStr))return trainingMat, hwLabels   def testDigits(kTup=('rbf', 10)):"""函数说明:测试函数Parameters:kTup - 包含核函数信息的元组Returns:无"""dataArr,labelArr = loadImages('trainingDigits')b,alphas = smoP(dataArr, labelArr, 200, 0.0001, 10, kTup)datMat = mat(dataArr); labelMat = mat(labelArr).transpose()svInd = nonzero(alphas.A>0)[0]sVs=datMat[svInd]labelSV = labelMat[svInd];print("支持向量个数:%d" % shape(sVs)[0])m,n = shape(datMat)errorCount = 0for i in range(m):kernelEval = kernelTrans(sVs,datMat[i,:],kTup)predict=kernelEval.T *multiply(labelSV,alphas[svInd]) + bif sign(predict) != sign(labelArr[i]): errorCount += 1print("训练集错误率: %.2f%%" % (float(errorCount)/m))dataArr,labelArr = loadImages('testDigits')errorCount = 0datMat = mat(dataArr); labelMat = mat(labelArr).transpose()m,n = shape(datMat)for i in range(m):kernelEval = kernelTrans(sVs,datMat[i,:],kTup)predict=kernelEval.T * multiply(labelSV,alphas[svInd]) + bif sign(predict) != sign(labelArr[i]): errorCount += 1   print("测试集错误率: %.2f%%" % (float(errorCount)/m))
#"""
if __name__ == '__main__':testDigits()
#"""    


基于pyhton3.6-机器学习实战-支持向量机SVM代码解释相关推荐

  1. 机器学习实战 支持向量机SVM 代码解析

    机器学习实战 支持向量机SVM 代码解析 <机器学习实战>用代码实现了算法,理解源代码更有助于我们掌握算法,但是比较适合有一定基础的小伙伴.svm这章代码看起来风轻云淡,实则对于新手来说有 ...

  2. 【机器学习】支持向量机(SVM)代码练习

    本课程是中国大学慕课<机器学习>的"支持向量机"章节的课后代码. 课程地址: https://www.icourse163.org/course/WZU-1464096 ...

  3. apriori算法代码_资源 | 《机器学习实战》及代码(基于Python3)

    〇.<机器学习实战> 今天推荐给大家的是<机器学习实战>这本书. 机器学习作为人工智能研究领域中一个极其重要的研究方向(一文章看懂人工智能.机器学习和深度学习),在当下极其热门 ...

  4. 转载-机器学习实战之SVM

    出处:https://www.cnblogs.com/zy230530/p/6901277.html 机器学习实战之SVM 一引言: 支持向量机这部分确实很多,想要真正的去理解它,不仅仅知道理论,还要 ...

  5. 《机器学习实战》配套代码下载

    <机器学习实战>配套代码资源下载网址:http://www.ituring.com.cn/book/1021(图灵社区),网址里有随书下载,可以下载配套资源.

  6. 机器学习实战——决策树(代码)

    最近在学习Peter Harrington的<机器学习实战>,代码与书中的略有不同,但可以顺利运行. from math import log import operator# 计算熵 d ...

  7. 【SVM预测】基于人工蜂群算法优化支持向量机SVM实现数据预测附Matlab代码

    1 简介 为确定合理的底板防水煤岩柱尺寸,减少底板突水安全事故的发生,利用支持向量机(SVM)与人工蜂群算法(ABCA)综合研究底板破坏深度问题.由于SVM训练参数惩罚因子C和核函数宽度g的选择对预测 ...

  8. 【SVM分类】基于人工蜂群算法优化支持向量机SVM实现数据分类附Matlab代码

    1 简介 为确定合理的底板防水煤岩柱尺寸,减少底板突水安全事故的发生,利用支持向量机(SVM)与人工蜂群算法(ABCA)综合研究底板破坏深度问题.由于SVM训练参数惩罚因子C和核函数宽度g的选择对预测 ...

  9. 机器学习实战之SVM

    一引言: 支持向量机这部分确实很多,想要真正的去理解它,不仅仅知道理论,还要进行相关的代码编写和测试,二者想和结合,才能更好的帮助我们理解SVM这一非常优秀的分类算法 支持向量机是一种二类分类算法,假 ...

最新文章

  1. “星链”或成美军未来作战理念新载体
  2. java文件正确编写格式_java Srpingboot框架书写mapper代码的正确格式
  3. 揭开Google暴利秘密的数学公式
  4. 最简单人工智能python_Python人工智能之路 - 第四篇 : jieba gensim 最好别分家之最简单的相似度实现...
  5. Spring Cloud Alibaba:Sentinel 热点参数限流
  6. sequence跳号问题及解决办法
  7. HDU 1166 敌兵布阵(线段树单点加区间查询)
  8. java 同步块_java 同步块(Java Synchronized Blocks)
  9. git命令行删除远程文件
  10. (Singleton)单例模式的Java实现
  11. 【观察】SAP HANA+英特尔傲腾:珠联璧合,所向披靡
  12. 计算机一级考试广告,2013年计算机一级考试MsOffice备考题及答案(21)
  13. C++ std::string 不可初始化为NULL及基本用法
  14. 1003.Crashing Balloon
  15. 在vue中设置背景图片
  16. leelen可视对讲怎么接线_楼道对讲门铃怎么接线
  17. C语言:统计句子中元音字母的个数
  18. Oracle触发器详细 和 Oracle 创建序列号
  19. sja1000 中断_CAN总线 SJA1000中断
  20. UVA - 1198 POJ - 1612 The Geodetic Set Problem (floyd+set+模拟)

热门文章

  1. sja1000 中断_SJA1000程序
  2. Java JVM内存模型(运行时数据区域)详解
  3. 全栈工程师眼中的HTTP
  4. 你“剁手”的时候,支付宝在干嘛?
  5. 假如有人把支付宝的服务器炸了, 存在支付宝里的钱是不是没了?
  6. POJ3255 Roadblocks ——次短路
  7. 洽洽:成于瓜子,困于瓜子
  8. CPP头文件中不应包含using声明
  9. linux硬盘对拷 软件,分享|10 个免费的磁盘克隆软件
  10. 某同步总线的时钟频率为100MHz,宽度为32位,地址/数据线复用,每传输一个地址或者数据就占用一个时钟周期。该总线支持猝发传输方式,则一次“主存写”总线事务传输128位数据所需的时间至少是