机器学习7—AdaBoost学习笔记
Adaboost算法原理分析和实例+代码(简明易懂)(转载)
【尊重原创,转载请注明出处】 http://blog.csdn.net/guyuealian/article/details/70995333
本人最初了解AdaBoost算法着实是花了几天时间,才明白他的基本原理。也许是自己能力有限吧,很多资料也是看得懵懵懂懂。网上找了一下关于Adaboost算法原理分析,大都是你复制我,我摘抄你,反正我也搞不清谁是原创。有些资料给出的Adaboost实例,要么是没有代码,要么省略很多步骤,让初学者很难看懂AdaBoost过程。
本博客将会详细介绍AdaBoost算法过程,并给出了一个Adaboost例子的详细求解过程,当然也给出了Matlab代码求解过程。碍于太多复杂公式,文章是在电脑Word文档写好再复制上博客的,为了排版好看,有些地方给出了截图。
下面给出几个我认为不错的博客资料:
【1】http://blog.csdn.net/v_july_v/article/details/40718799 感谢这位博主给出了 Adaboost 算法的原理与推导,本文章很多地方都参考了他的内容
【2】http://blog.csdn.net/m0_37407756/article/details/67637400 该博客有一个Adaboost 算法的例子,但其过程简略太多,初学者很难看懂。本文章的Adaboost 算法例子也是与之相对应的,但本人给出了详细的步骤和分析过程。话说,图都是我一个一个画上去,心疼我用了两天时间!!
一、AdaBoost简介
Boosting, 也称为增强学习或提升法,是一种重要的集成学习技术, 能够将预测精度仅比随机猜度略高的弱学习器增强为预测精度高的强学习器,这在直接构造强学习器非常困难的情况下,为学习算法的设计提供了一种有效的新思路和新方法。其中最为成功应用的是,Yoav Freund和Robert Schapire在1995年提出的AdaBoost算法。
AdaBoost是英文"Adaptive Boosting"(自适应增强)的缩写,它的自适应在于:前一个基本分类器被错误分类的样本的权值会增大,而正确分类的样本的权值会减小,并再次用来训练下一个基本分类器。同时,在每一轮迭代中,加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数才确定最终的强分类器。
Adaboost算法可以简述为三个步骤:
(1)首先,是初始化训练数据的权值分布D
1
。假设有N个训练样本数据,则每一个训练样本最开始时,都被赋予相同的权值:w
1
=1/N。
(2)然后,训练弱分类器hi。具体训练过程中是:如果某个训练样本点,被弱分类器hi准确地分类,那么在构造下一个训练集中,它对应的权值要减小;相反,如果某个训练样本点被错误分类,那么它的权值就应该增大。权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
(3)最后,将各个训练得到的弱分类器组合成一个强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。
换而言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
二、AdaBoost算法过程
给定训练数据集:,其中用于表示训练样本的类别标签,i=1,...,N。Adaboost的目的就是从训练数据中学习一系列弱分类器或基本分类器,然后将这些弱分类器组合成一个强分类器。
相关符号定义:
Adaboost的算法流程如下:
相关说明:
综合上面的推导,可得样本分错与分对时,其权值更新的公式为:
三、AdaBoost实例讲解
例:给定如图所示的训练样本,弱分类器采用平行于坐标轴的直线,用Adaboost算法的实现强分类过程。
数据分析:
将这10个样本作为训练数据,根据 X 和Y 的对应关系,可把这10个数据分为两类,图中用“+”表示类别1,用“O”表示类别-1。本例使用水平或者垂直的直线作为分类器,图中已经给出了三个弱分类器,即:
初始化:
首先需要初始化训练样本数据的权值分布,每一个训练样本最开始时都被赋予相同的权值:wi=1/N,这样训练样本集的初始权值分布D1(i):
令每个权值w1i = 1/N = 0.1,其中,N = 10,i = 1,2, ..., 10,然后分别对于t= 1,2,3, ...等值进行迭代(t表示迭代次数,表示第t轮),下表已经给出训练样本的权值分布情况:
第1次迭代t=1:
初试的权值分布D1为1/N(10个数据,每个数据的权值皆初始化为0.1),
D1=[0.1, 0.1, 0.1, 0.1, 0.1, 0.1,0.1, 0.1, 0.1, 0.1]
在权值分布D1的情况下,取已知的三个弱分类器h1、h2和h3中误差率最小的分类器作为第1个基本分类器H1(x)(三个弱分类器的误差率都是0.3,那就取第1个吧)
在分类器H1(x)=h1情况下,样本点“5 7 8”被错分,因此基本分类器H1(x)的误差率为:
可见,被误分类样本的权值之和影响误差率e,误差率e影响基本分类器在最终分类器中所占的权重α。
然后,更新训练样本数据的权值分布,用于下一轮迭代,对于正确分类的训练样本“1 2 3 4 6 9 10”(共7个)的权值更新为:
这样,第1轮迭代后,最后得到各个样本数据新的权值分布:
D2=[1/14,1/14,1/14,1/14,1/6,1/14,1/6,1/6,1/14,1/14]
由于样本数据“5 7 8”被H1(x)分错了,所以它们的权值由之前的0.1增大到1/6;反之,其它数据皆被分正确,所以它们的权值皆由之前的0.1减小到1/14,下表给出了权值分布的变换情况:
可得分类函数:f1(x)= α1H1(x) = 0.4236H1(x)。此时,组合一个基本分类器sign(f1(x))作为强分类器在训练数据集上有3个误分类点(即5 7 8),此时强分类器的训练错误为:0.3
第二次迭代t=2:
在权值分布D
2
的情况下,再取三个弱分类器h
1
、h
2
和h
3
中误差率最小的分类器作为第2个基本分类器H
2
(x):
① 当取弱分类器h
1
=X
1
=2.5时,此时被错分的样本点为“5 7 8”:
误差率e=1/6+1/6+1/6=3/6=1/2;
② 当取弱分类器h
2
=X
1
=8.5时,此时被错分的样本点为“3 4 6”:
误差率e=1/14+1/14+1/14=3/14;
③ 当取弱分类器h
3
=X
2
=6.5时,此时被错分的样本点为“1 2 9”:
误差率e=1/14+1/14+1/14=3/14;
因此,取当前最小的分类器h
2
作为第2个基本分类器H
2
(x):
显然,H2(x)把样本“3 4 6”分错了,根据D2可知它们的权值为D2(3)=1/14,D2(4)=1/14, D2(6)=1/14,所以H2(x)在训练数据集上的误差率:
这样,第2轮迭代后,最后得到各个样本数据新的权值分布:
D3=[1/22,1/22,1/6,1/6,7/66,1/6,7/66,7/66,1/22,1/22]
下表给出了权值分布的变换情况:
可得分类函数:f2(x)=0.4236H1(x) + 0.6496H2(x)。此时,组合两个基本分类器sign(f2(x))作为强分类器在训练数据集上有3个误分类点(即3 4 6),此时强分类器的训练错误为:0.3
第三次迭代t=3:
在权值分布D
3
的情况下,再取三个弱分类器h
1
、h
2
和h
3
中误差率最小的分类器作为第3个基本分类器H
3
(x):
① 当取弱分类器h
1
=X
1
=2.5时,此时被错分的样本点为“5 7 8”:
误差率e=7/66+7/66+7/66=7/22;
② 当取弱分类器h
2
=X
1
=8.5时,此时被错分的样本点为“3 4 6”:
误差率e=1/6+1/6+1/6=1/2=0.5;
③ 当取弱分类器h
3
=X
2
=6.5时,此时被错分的样本点为“1 2 9”:
误差率e=1/22+1/22+1/22=3/22;
因此,取当前最小的分类器h3作为第3个基本分类器H3(x):
这样,第3轮迭代后,得到各个样本数据新的权值分布为:
D4=[1/6,1/6,11/114,11/114,7/114,11/114,7/114,7/114,1/6,1/38]
下表给出了权值分布的变换情况:
可得分类函数:f3(x)=0.4236H1(x) + 0.6496H2(x)+0.9229H3(x)。此时,组合三个基本分类器sign(f3(x))作为强分类器,在训练数据集上有0个误分类点。至此,整个训练过程结束。
整合所有分类器,可得最终的强分类器为:
这个强分类器Hfinal对训练样本的错误率为0!
本例Matlab代码,如下:
先建立Matlab函数文件,定义h1,h2和h3三个弱分类器
- function kind = wcH1( X,TH )
- %h1弱分类器
- X1=X(1);
- X2=X(2);
- if X1<TH
- kind=1;
- else
- kind=-1;
- end
- end
- function kind = wcH2( X,TH )
- %h2弱分类器
- X1=X(1);
- X2=X(2);
- if X1<TH
- kind=1;
- else
- kind=-1;
- end
- end
- function kind = wcH3( X,TH )
- %h3弱分类器
- X1=X(1);
- X2=X(2);
- if X2<TH
- kind=-1;
- else
- kind=1;
- end
- end
主程序Matlab代码:
- clc,clear all;
- %% 训练样本数据
- xData=[1 5;2 2;3 1;4 6;6 8;6 5;7 9;8 7;9 8;10 2] %样本数据点,对应编号为1,2,...10
- Y=[1 1 -1 -1 1 -1 1 1 -1 -1]'; %对应的样本类别,用1和-1表示
- xNum=1:10; %编号
- format rat
- %% 绘制样本分布图
- L1=find(Y==1);
- x=xData(L1,1);y=xData(L1,2);
- plot(x,y,'b+','LineWidth',3,'MarkerSize',12);
- hold on;
- L2=find(Y==-1);
- x=xData(L2,1);y=xData(L2,2);
- plot(x,y,'ro','LineWidth',3,'MarkerSize',12);
- xlabel('X1');ylabel('X2');axis([0 10 0 10])
- %% ***********************************初试过程************************************
- H1=zeros(10,1);H2=H1;H3=H1
- for i=1:10
- X=xData(i,:);
- H1(i) = wcH1( X,2.5 );%弱分类器h1
- H2(i) = wcH2( X,8.5 );%弱分类器h2
- H3(i) = wcH3( X,6.5 );%弱分类器h3
- end
- errDataH1=find(H1~=Y);%找到被h1错分的样本点的序号
- errDataH2=find(H2~=Y);%找到被h2错分的样本点的序号
- errDataH3=find(H3~=Y);%找到被h3错分的样本点的序号
- accDataH1=find(H1==Y);%找到被h1正确分的样本点的序号
- accDataH2=find(H2==Y);%找到被h2正确分的样本点的序号
- accDataH3=find(H3==Y);%找到被h3正确分的样本点的序号
- errDataAll=[errDataH1,errDataH2,errDataH3];
- accDataAll=[accDataH1,accDataH2,accDataH3];
- N=10;
- D1=zeros(10,1)+1/N % 初始化权值分布
- %% ***********************************第一次迭代***********************************
- err1=sum(D1(errDataH1,:));%所有被错分类的样本点的权值之和即为误差率
- err2=sum(D1(errDataH2,:));%所有被错分类的样本点的权值之和即为误差率
- err3=sum(D1(errDataH3,:));%所有被错分类的样本点的权值之和即为误差率
- errAll=[err1,err2,err3];
- [minErr,minIndex]=min(errAll);
- %根据误差率e1计算H1的系数:
- a1=0.5*log((1-minErr)/minErr)
- minErrData=errDataAll(:,minIndex);
- minAccData=accDataAll(:,minIndex);
- D2=D1;
- for i=minAccData'
- D2(i)=D2(i)/(2*(1-minErr));
- end
- for i=minErrData'
- D2(i)=D2(i)/(2*minErr);
- end
- D2
- %分类函数
- f1=a1.*H1;
- kindFinal=sign(f1)%此时强分类器的分类结果
- %% ***********************************第二次迭代***********************************
- err1=sum(D2(errDataH1,:));%所有被错分类的样本点的权值之和即为误差率
- err2=sum(D2(errDataH2,:));%所有被错分类的样本点的权值之和即为误差率
- err3=sum(D2(errDataH3,:));%所有被错分类的样本点的权值之和即为误差率
- errAll=[err1,err2,err3];
- [minErr,minIndex]=min(errAll);
- % 根据误差率e2计算H2的系数:
- a2=0.5*log((1-minErr)/minErr)
- minErrData=errDataAll(:,minIndex);
- minAccData=accDataAll(:,minIndex);
- D3=D2;
- for i=minAccData'
- D3(i)=D3(i)/(2*(1-minErr));
- end
- for i=minErrData'
- D3(i)=D3(i)/(2*minErr);
- end
- D3
- % 分类函数
- f2=a1.*H1+a2*H2;
- kindFinal=sign(f2)%此时强分类器的分类结果
- %% ***********************************第三次迭代***********************************
- err1=sum(D3(errDataH1,:));%所有被错分类的样本点的权值之和即为误差率
- err2=sum(D3(errDataH2,:));%所有被错分类的样本点的权值之和即为误差率
- err3=sum(D3(errDataH3,:));%所有被错分类的样本点的权值之和即为误差率
- errAll=[err1,err2,err3];
- [minErr,minIndex]=min(errAll);
- % 根据误差率e3计算G3的系数:
- a3=0.5*log((1-minErr)/minErr)
- minErrData=errDataAll(:,minIndex);
- minAccData=accDataAll(:,minIndex);
- D4=D3;
- for i=minAccData'
- D4(i)=D4(i)/(2*(1-minErr));
- end
- for i=minErrData'
- D4(i)=D4(i)/(2*minErr);
- end
- D4
- % 分类函数
- f3=a1.*H1+a2*H2+a3*H3;
- kindFinal=sign(f3)%此时强分类器的分类结果
- %%
Adaboost算法的某些特性是非常好的,这里主要介绍Adaboost的两个特性。(1)是训练的错误率上界,随着迭代次数的增加,会逐渐下降;(2)是Adaboost算法即使训练次数很多,也不会出现过拟合的问题。关于这两方面的研究和分析,我建议各大网友,还是看看大神的博客:http://blog.csdn.net/v_july_v/article/details/40718799
四、AdaBoost的优点和缺点
优点
(1)Adaboost提供一种框架,在框架内可以使用各种方法构建子分类器。可以使用简单的弱分类器,不用对特征进行筛选,也不存在过拟合的现象。
(2)Adaboost算法不需要弱分类器的先验知识,最后得到的强分类器的分类精度依赖于所有弱分类器。无论是应用于人造数据还是真实数据,Adaboost都能显著的提高学习精度。
(3)Adaboost算法不需要预先知道弱分类器的错误率上限,且最后得到的强分类器的分类精度依赖于所有弱分类器的分类精度,可以深挖分类器的能力。Adaboost可以根据弱分类器的反馈,自适应地调整假定的错误率,执行的效率高。
(4)Adaboost对同一个训练样本集训练不同的弱分类器,按照一定的方法把这些弱分类器集合起来,构造一个分类能力很强的强分类器,即“三个臭皮匠赛过一个诸葛亮”。
缺点:
在Adaboost训练过程中,Adaboost会使得难于分类样本的权值呈指数增长,训练将会过于偏向这类困难的样本,导致Adaboost算法易受噪声干扰。此外,Adaboost依赖于弱分类器,而弱分类器的训练时间往往很长。
test7.py
#-*- coding:utf-8 import sys
sys.path.append("adaboost.py") import adaboost
from numpy import * # datMat, classLabels = adaboost.loadSimpData()
# D = mat(ones((5,1))/5)
#
# adaboost.buildStump(datMat, classLabels, D)
#
# classifierArray = adaboost.adaBoostTrainDS(datMat, classLabels, 9)
# print(classifierArray) # datArr, labelArr = adaboost.loadSimpData()
# classifierArr, aggClassEst = adaboost.adaBoostTrainDS(datArr, labelArr, 30)
# print("classifierArr: ")
# print(classifierArr)
# print("classifierArr: over")
#
# # sigAggClassEst = adaboost.adaClassify([0, 0], classifierArr)
# sigAggClassEst = adaboost.adaClassify([[5, 5], [0, 0]], classifierArr)
# print(sigAggClassEst) # datArr, labelArr = adaboost.loadDataSet("horseColicTraining2.txt")
# classifierArray, aggClassEst = adaboost.adaBoostTrainDS(datArr, labelArr, 10)
# print(classifierArray)
#
# testArr, testLabelArr = adaboost.loadDataSet("horseColicTest2.txt")
# prediction10 = adaboost.adaClassify(testArr, classifierArray)
#
# errArr = mat(ones((67, 1)))
# errNum = errArr[prediction10 != mat(testLabelArr).T].sum()
# print(errNum) datArr, labelArr = adaboost.loadDataSet('horseColicTraining2.txt')
classifierArray, aggClassEst = adaboost.adaBoostTrainDS(datArr, labelArr, 10)
adaboost.plotROC(aggClassEst.T, labelArr) print("over!")
adaboost.py
'''
Created on Nov 28, 2010
Adaboost is short for Adaptive Boosting
@author: Peter
'''
from numpy import * def loadSimpData():
datMat = matrix([[ 1. , 2.1],
[ 2. , 1.1],
[ 1.3, 1. ],
[ 1. , 1. ],
[ 2. , 1. ]])
classLabels = [1.0, 1.0, -1.0, -1.0, 1.0]
return datMat,classLabels def loadDataSet(fileName): #general function to parse tab -delimited floats
numFeat = len(open(fileName).readline().split('\t')) #get number of fields
dataMat = []; labelMat = []
fr = open(fileName)
for line in fr.readlines():
lineArr =[]
curLine = line.strip().split('\t')
for i in range(numFeat-1):
lineArr.append(float(curLine[i]))
dataMat.append(lineArr)
labelMat.append(float(curLine[-1]))
return dataMat,labelMat def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):#just classify the data
retArray = ones((shape(dataMatrix)[0],1))
if threshIneq == 'lt':
retArray[dataMatrix[:,dimen] <= threshVal] = -1.0
else:
retArray[dataMatrix[:,dimen] > threshVal] = -1.0
return retArray def buildStump(dataArr,classLabels,D):
dataMatrix = mat(dataArr); labelMat = mat(classLabels).T
m,n = shape(dataMatrix)
numSteps = 10.0; bestStump = {}; bestClasEst = mat(zeros((m,1)))
minError = inf #init error sum, to +infinity
for i in range(n):#loop over all dimensions
rangeMin = dataMatrix[:,i].min(); rangeMax = dataMatrix[:,i].max();
stepSize = (rangeMax-rangeMin)/numSteps
for j in range(-1,int(numSteps)+1):#loop over all range in current dimension
for inequal in ['lt', 'gt']: #go over less than and greater than
threshVal = (rangeMin + float(j) * stepSize)
predictedVals = stumpClassify(dataMatrix,i,threshVal,inequal)#call stump classify with i, j, lessThan
errArr = mat(ones((m,1)))
errArr[predictedVals == labelMat] = 0
weightedError = D.T*errArr #calc total error multiplied by D
# print("split: dim %d, thresh %.2f, thresh ineqal: %s, the weighted error is %.3f" % (i, threshVal, inequal, weightedError))
if weightedError < minError:
minError = weightedError
bestClasEst = predictedVals.copy()
bestStump['dim'] = i
bestStump['thresh'] = threshVal
bestStump['ineq'] = inequal
return bestStump,minError,bestClasEst def adaBoostTrainDS(dataArr,classLabels,numIt=40):
weakClassArr = []
m = shape(dataArr)[0]
D = mat(ones((m,1))/m) #init D to all equal
aggClassEst = mat(zeros((m,1)))
for i in range(numIt):
bestStump,error,classEst = buildStump(dataArr,classLabels,D)#build Stump
print("D:",D.T)
alpha = float(0.5*log((1.0-error)/max(error,1e-16)))#calc alpha, throw in max(error,eps) to account for error=0
bestStump['alpha'] = alpha
weakClassArr.append(bestStump) #store Stump Params in Array
print("classEst: ",classEst.T)
expon = multiply(-1*alpha*mat(classLabels).T,classEst) #exponent for D calc, getting messy
D = multiply(D,exp(expon)) #Calc New D for next iteration
D = D/D.sum()
#calc training error of all classifiers, if this is 0 quit for loop early (use break)
aggClassEst += alpha*classEst
print("aggClassEst: ",aggClassEst.T)
aggErrors = multiply(sign(aggClassEst) != mat(classLabels).T,ones((m,1)))
errorRate = aggErrors.sum()/m
print("total error: ",errorRate)
if errorRate == 0.0: break
return weakClassArr,aggClassEst def adaClassify(datToClass,classifierArr):
dataMatrix = mat(datToClass)#do stuff similar to last aggClassEst in adaBoostTrainDS
m = shape(dataMatrix)[0]
aggClassEst = mat(zeros((m,1)))
for i in range(len(classifierArr)):
classEst = stumpClassify(dataMatrix, classifierArr[i]['dim'], classifierArr[i]['thresh'], classifierArr[i]['ineq'])#call stump classify
aggClassEst += classifierArr[i]['alpha']*classEst
print(aggClassEst)
return sign(aggClassEst) def plotROC(predStrengths, classLabels):
import matplotlib.pyplot as plt
cur = (1.0,1.0) #cursor
ySum = 0.0 #variable to calculate AUC
numPosClas = sum(array(classLabels)==1.0)
yStep = 1/float(numPosClas); xStep = 1/float(len(classLabels)-numPosClas)
sortedIndicies = predStrengths.argsort()#get sorted index, it's reverse
fig = plt.figure()
fig.clf()
ax = plt.subplot(111)
#loop through all the values, drawing a line segment at each point
for index in sortedIndicies.tolist()[0]:
if classLabels[index] == 1.0:
delX = 0; delY = yStep;
else:
delX = xStep; delY = 0;
ySum += cur[1]
#draw line from cur to (cur[0]-delX,cur[1]-delY)
ax.plot([cur[0],cur[0]-delX],[cur[1],cur[1]-delY], c='b')
cur = (cur[0]-delX,cur[1]-delY)
ax.plot([0,1],[0,1],'b--')
plt.xlabel('False positive rate'); plt.ylabel('True positive rate')
plt.title('ROC curve for AdaBoost horse colic detection system')
ax.axis([0,1,0,1])
plt.show()
print("the Area Under the Curve is: ",ySum*xStep)
机器学习7—AdaBoost学习笔记的更多相关文章
- 《机器学习实战》学习笔记第十四章 —— 利用SVD简化数据
相关博客: 吴恩达机器学习笔记(八) —— 降维与主成分分析法(PCA) <机器学习实战>学习笔记第十三章 —— 利用PCA来简化数据 奇异值分解(SVD)原理与在降维中的应用 机器学习( ...
- 《机器学习实战》学习笔记第九章 —— 决策树之CART算法
相关博文: <机器学习实战>学习笔记第三章 —— 决策树 主要内容: 一.CART算法简介 二.分类树 三.回归树 四.构建回归树 五.回归树的剪枝 六.模型树 七.树回归与标准回归的比较 ...
- (转载)林轩田机器学习基石课程学习笔记1 — The Learning Problem
(转载)林轩田机器学习基石课程学习笔记1 - The Learning Problem When Can Machine Learn? Why Can Machine Learn? How Can M ...
- Coursera台大机器学习基础课程学习笔记1 -- 机器学习定义及PLA算法
最近在跟台大的这个课程,觉得不错,想把学习笔记发出来跟大家分享下,有错误希望大家指正. 一机器学习是什么? 感觉和 Tom M. Mitchell的定义几乎一致, A computer program ...
- MNIST机器学习入门【学习笔记】
平台信息:PC:ubuntu18.04.i5.anaconda2.cuda9.0.cudnn7.0.5.tensorflow1.10.GTX1060 作者:庄泽彬(欢迎转载,请注明作者) 说明:本文是 ...
- 《机器学习实战》学习笔记第七章 —— AdaBoost元算法
主要内容: 一.提升方法与AdaBoost算法的简介 二.AdaBoost算法 三.代码解释 一.提升方法与AdaBoost算法的简介 1.提升方法:从弱学习算法出发,反复学习,得到一系列弱分类器(又 ...
- AdaBoost学习笔记
学习了李航<统计学习方法>第八章的提升方法,现在对常用的一种提升方法AdaBoost作一个小小的笔记,并用python实现书本上的例子,加深印象.提升方法(boosting)是一种常用的统 ...
- Andrew N.G的机器学习公开课学习笔记(一):机器学习的动机与应用
机器学习由对于人工智能的研究而来,是一个综合性和应用性学科,可以用来解决计算机视觉/生物学/机器人和日常语言等各个领域的问题,机器学习的目的是让计算机具有像人类的学习能力,这样做是因为我们发现,计算机 ...
- Coursera台大机器学习基础课程学习笔记2 -- 机器学习的分类
总体思路: 各种类型的机器学习分类 按照输出空间类型分Y 按照数据标记类型分yn 按照不同目标函数类型分f 按照不同的输入空间类型分X 按照输出空间类型Y,可以分为二元分类,多元分类,回归分析以及结构 ...
随机推荐
- 洛谷——P1579 哥德巴赫猜想(升级版)
P1579 哥德巴赫猜想(升级版) 题目背景 1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和.质数是指除了1和本身之外没有其他约 ...
- Visio中如何让重叠图形都显示
如图,两个矩形重叠部分的边框都显示了,是拆分操作,不是组合.
- VMware报错“原因: 未能锁定文件”,打开失败
原文:http://jingyan.baidu.com/article/425e69e6bf64dbbe15fc16fe.html VMware打开复制的虚拟机,报错“原因: 未能锁定文件”,打开失败 ...
- Linqpad使用(调试Linq、结合linq调试业务场景、表格内编辑数据)
linqpad是一款linq语句调试工具,功能如下: 1.直接执行linq语句并查看生成的原生sql语句 2.可结合linq+C#代码进行业务场景调试 3.表格内直接新增.修改.删除数据 4.直接 ...
- 关于在SSH2中使用ajax技术的总结(主要写Struts2和ajax)
以下内容是自己理解的,因为还没有看过相关的文章,所以,技术上还是有很大的欠缺.不过这也是自己努力思考得到的,如果有什么更好的建议可以回复我. 1. 任务需求: 实现一个包含数据的表格,并且有分页功能. ...
- jstl的错误总结与解决方法
哎,真他娘的无语了,jstl标签竟然还与tomcat的版本有关.一会报错:java.lang.AbstractMethodError: javax.servlet.jsp.PageContext.ge ...
- python读写文件write和flush
打开文件用open,该函数创建一个文件对象,这将用来调用与之关联的其他支持方式. file object = open(file_name [, access_mode][, buffering]) ...
- ASP.NET MVC学习---(一)ORM框架,EF实体数据模型简介
现如今 对象关系映射(ORM)框架 被大量的使用于企业级应用的开发 为什么要使用ORM? ADO.NET操作数据库不好吗? 我们可以仔细想想 当我们使用ADO.NET操作数据库的时候 我们需要先获取连 ...
- 输出C语言中 变量的类型
使用gcc的警告信息间接知道变量的类型 #include <stdio.h> #include <stdlib.h> #include <stddef.h> #in ...
- ionic准备之angular基础——继承(3)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...