python的逻辑运算,Python的逻辑运算符

  python的逻辑运算,Python的逻辑运算符

  为什么要用sigmoid函数上两节已经说了,逻辑人格的可乐回归只是在线性回归的基础上应用了一个逻辑函数,也解释了线性的原因。如果你忘记了,你可以回头看看。

  下面详细解释一下逻辑型人格的可乐为什么会选择使用sigmoid函数。

  为什么sigmoid函数假设数据集有n个独立特征,x1到xn是样本的n个特征?传统回归算法的目标是拟合多项式函数(线性函数)以最小化预测值和真实值之间的误差:

  而线性回归的稳健性较差,可能会因为少量的噪声导致模型较差,主要是因为线性模型对整个实数域的敏感性是一致的。我们需要解决的是:对大部分集中数据敏感,对少数边缘数据不敏感。另一方面,我们希望我们的模型能够有一个很好的逻辑判断性质,最好能够直接表示出特征为X的样本被归入某一类的概率,并将概率范围控制在[0,1]内。比如,假设我们的模型是f (x),当f(x)为0.5时,样本x被归为正常类;当f (x)为0.5时,样本x被分类为阴性。所以考虑一下是否有这样一个功能可以满足以上两个要求?

  这就是我们的救世主出现的时候:sigmoid函数!

  首先,给出sigmoid函数的定义:

  那么我们来看看sigmoid函数图像:

  A.从图像中可以看出,当x接近0时,函数图像是陡峭的,而在水平轴的两端,即x0或x0,图像是稳定的。也就是说,函数对0附近的数据敏感,而对边缘数据不敏感。这满足了我们的第一个需求。b .通过sigmoid函数的性质,可以知道它的定义域全是实数,取值范围在[0,1]之间,当x0,f (x)为0.5时(正常类);x=0时F(x)=0.5(中性);x0时F(x)0.5(负类)。这满足了我们的第二个需求。就是这样!如何将线性函数转化为sigmoid函数

  设线性函数为f(x),设P(x)=P(Y=1X=x):特征为X的样本被归入第1类的概率,则定义为比值比。然后我们希望线性函数f(x)达到我们期望的概率结果。

  例如,当p (x)为0.5时,P(x)/[1-P(x)]1,则f(x)0。换句话说,只要我们的线性函数满足f(x)0,就会有P(x)0.5。此时x属于正常类。同样,当f(x)为0时,就会有P(x)为0.5。此时x属于负类,与上一部分解释的sigmoid函数完全一致。让我们进行下面的转换:

  设置:

  让我们求解P(x):

  那么P(x)就是我们想要的一种概率模型,也就是我们所说的逻辑人格的可乐回归模型,也就是说逻辑人格的可乐回归模型是一种概率模型。

  大蟒实现#算法一调用实例里面的方法# _ * _编码:utf-8 _ * _从matplotlib导入pyplotimport scipy as sp从matplotlib导入numpy as NP从sk learn导入pylab。交叉验证从sk学习导入train _ test _ split。特征提取。从sk learn导入文本tfidfvectorizer。指标从sk learn导入precision _ recall _ curve。从sk learn导入度量分类_报告。linear _ model导入logisticregression导入时间start _ time=time。时间()#绘制R/p曲线def plot_pr(auc_score,precision,recall,label=None):pylab。fig(num=None,figsize=(6,5)) pylab.xlim([0.0,1.0]) pylab.ylim([0.0,1.0]) pylab。xlabel(“召回”)pylab。y label(“Precision”)pylab。title( P/R(AUC=% 0.2f)/% s %(AUC _ score,label))pylab。fill _ between(回忆,精度,alpha读取电影_数据=sp。load( move _ data。npy )movie _ target=sp。load( move _ target。npy )x=movie _ datay=movie _ target #向量空间模型,count _ vec=TfidfVectorizer(binary=False,decode_error=ignore ,\ stop _ words= English )average=0 testnum=10 #注意,训练样本调用拟合_转换接口,测试样本调用的是改变接口对于范围内的I(0,testNum): #加载数据集,切分数据集80%训练,20%测试x _训练,x _测试,y_train,y _ test \=train _ test _ split(movie _ data,movie_target,test _ size=0.2)x _ train=count _ vec。拟合_变换(x _训练)x _测试=计数_向量。转换(x _ test)#训练实验室反应堆分类器clf=LogisticRegression()。fit(x _ train,y _ train)y _ pred=clf预测(x _ test)p=NP。均值(y _ pred==y _ test)打印第%d次测试的准确率为:%.5f%(i,p)平均值=p#精确率与召回率#答案=clf。predict _ proba(x _ test)[:0]#属于第底片类的概率答案=clf.predict_proba(x_test)[:1]#属于第刷卡机类的概率#这个地方可以查看官方文档,精度,召回,阈值=精度_召回_曲线(y _测试,答案)#阈值对应着一个向量,个数为回答中不重复的值的个数,每个位置上的值对应着一个阈值,并且是越来越大#精度和召回也是一个向量,个数比阈值多一个,精度最后一个为1、回忆最后一个值为0,确保图像从x轴=0开始#精度每个值对应着,当阈值为阈值对应位置值的时候的准确度#例如:当取值取阈值[0]的时候,精度[0]表示所有的训练集所对应的准确率召回[0]表示召回率报告=答案0.5#这里的0.5可以换为其他值#我们通常使用0.5来划分两类数据,但是我们可以根据P/R图分析,选择一个合适的优秀的阈值。打印报告print(class ification _ report(y _ test,report,target_names=[neg , pos]))print(平均精确度为:,average/testNum)print(花费的时间为:,时间。time()-start _ time)plot _ pr(0.6,precision,recall, pos )实验结果:

  第0次测试的准确率为:0.81071第一次测试的准确率为:0.79643第2次测试的准确率为:0.79643第3次测试的准确率为:0.80000第四次测试的准确率为:0.80714第5次测试的准确率为:0.81071第6次测试的准确率为:0.75714第七次测试的准确率为:0.78214第8次测试的准确率为:0.78214第9次测试的准确率为:0.81429精确召回f1-得分支持负0.84 0.79 0.81 145位置0.79 0.84 0.81 135平均/总0.82 0.81 0.81 280平均精度率为: 0.795714285714花费时间为: 12.1490001678

  通过上图可以看出,如果选择的阈值过低,那么更多的测试样本都将分为一类,因此召回率得到提升,但是要牺牲相应的准确率。

  注意精度_召回_曲线()方法中的阈值中的阈值是逐渐增大的,对应到图像是就会,x轴从左到右对应的阈值是逐渐减小的。

  # -*-编码:utf-8-*-将matplotlib.pyplot导入为血小板计数从绘制精美的图表导入动画将数组导入为np#加载数据集def loadDataSet():“”:返回:输入向量矩阵和输出向量 dataMat=[]label mat=[]fr=open( test。txt , r)#一共有三列,每一列为x1,x2,Y代表fr中的行。read lines():线性r=line。strip().拆分( ##) #注意在这里将字符串转换成漂浮物型的时候总是遇到问题#感觉每一行的开头存在其他字符,所以我们多添加了一列"##"分隔符,是的第一个有效数字从第二个开始dataMat.append([1.0,float(lineArr[1])),float(lineArr[2])#设x0为1,构成拓展之后的输入向量labelMat.append(int(lineArr[3]))返回数据材质,标签材质#可视化数据,画出数据集合逻辑个性的可乐最佳回归直线def plotBestFit(权重):data mat,label mat=load dataset()data arr=NP。数组(数据矩阵)n=数据数组。shape[0]x1=[]y1=[]x2=[]y2=[]for I in range(n):if int(label mat[I])==1:x1。append(data arr[I,1]) y1.append(dataArr[i,2]) else: x2.append(dataArr[i,1]) y2.append(dataArr[i,2])fig=PLT。无花果令w0*x0 w1*x1 w2*x2=0,其中x0=1,解出x1和x2的关系轴绘图(x,y)PLT。xlabel( X1 )工厂。伊拉贝尔( X2 )工厂。show()def sigmoid(inX):return 1.0/(1np。exp(-inX))#逻辑斯提回归梯度上升批量算法,静态展示def gradAscent_static(dataMatIn,类标签): :param data matin:输入X矩阵,每一行代表一个实例,每一列分别是x0,x1,x2:参数类标签:类别标签组成的向量:返回:权值向量 dataMatrix=np.mat(dataMatIn)#转换为数组矩阵数据类型,(100,3) labelMat=np.mat(classLabels).转置()#转换为数组矩阵数据类型、(100,1) m,n=数据矩阵。形状alpha=0.001最大循环数=500权重=NP。一个((n,1))#(3,1)对于范围内的k(最大周期数):h=sigmoid(数据矩阵*权重)误差=(标签mat-h)#向量减法权重=alpha *数据矩阵。转置()*错误#矩阵内积返回权重def draw _ line(weights,lines): x=np.arange(-5.0,5.0,0.1)y=(-weights[0]-weights[1]* x)/weights[2]#令w0*x0 w1*x1 w2*x2=0,其中x0=1,解出x1和x2的关系lines.set_data(x,y)返回linesdef main1():#实现批量梯度上升,展示静态图像数据,标签=加载数据集()权重=坡度上升_静态(数据,标签)plotBestFit(权重)#静态图if __name__==__main__: main1()实验结果:

  最终得到的权重向量为: [[ 4.12414349] [ 0.48007329] [-0.6168482 ]]

  所谓的不平凡就是平凡的普通次幂-艾达

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: