暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

机器学习-逻辑回归复习

量化分析之路 2020-04-05
346

首先我们先简单了解一下线性回归,

线性回归

利用大量的样本,通过有监督的学习,学习到由x到y的映射f,利用该映射关系对未知的数据进行预估,因为y为连续值,所以是回归问题。


线性回归的假设函数:f(x)=θ0x0+θ1x1+θ2x2...+θnxn

向量形式(θ,x都是列向量):f(x)=θTx

某些数据是线性可分的

些数据线性可分。如2.5右所示:无训练出一条线性直线将数据区分开

某些数据的线性分类 会导致数据不准确。

逻辑回归虽然叫回归,一般用于二分类,就拿比较出名的肿瘤分类为例

我们以绿竖线为例,横坐标为肿瘤大小  肿瘤之分类 良性(0) 恶性(1)

大于绿线的为恶性  小于绿线的为良性  我们看到 下图得到的线性回归方程没办法很好的分类该问题。



分类的本质:在空间中找到一个决策边界来完成分类的决策


逻辑回归:线性回归可以预测连续值,但是有时不能很好的解决分类问题,我们需要根据预测的结果判定其属于正类还是负类。

所以逻辑回归就是将线性回归的(,+)结果,

通过sigmoid函数映射到(0,1)之间。 

 

获得逻辑回归的决策函数:

我们将 y 视为 x 为正例的概率,则 1-y 为 x 为其反例的概率。两者的比值称为几率(odds),指该事件发生与不发生的概率比值,若事件发生的概率为 p。则对数几率:

将 y 视为类后验概率估计,

    也就是说,输出 Y=1 的对数几率是由输入 x 的线性函数表示的模型,这就是逻辑回归模型。当 的值越接近正无穷, 概率值也就越接近 1。因此逻辑回归的思路是,先拟合决策边界(不局限于线性,还可以是多项式),再建立这个边界与分类的概率联系,从而得到了二分类情况下的概率


其优点有:

  1. 直接对分类的概率建模,无需实现假设数据分布,从而避免了假设分布不准确带来的问题;

  2. 不仅可预测出类别,还能得到该预测的概率,这对一些利用概率辅助决策的任务很有用;

  3. 对数几率函数是任意阶可导的凸函数,有许多数值优化算法都可以求出最优解。



逻辑回归模型的数学形式确定后,剩下就是如何去求解模型中的参数。在统计学中,常常使用极大似然估计法来求解,即找到一组参数,使得在这组参数下,我们的数据的似然度(概率)最大。

设:

似然函数:

为了更方便求解,我们对等式两边同取对数,写成对数似然函数:

损失函数:是用来衡量算法的运行情况,优化模型因为神经网络的目标是最小化代价或者损失

    函数最优化的时候习惯让一个函数越小越好,所以我们在前边加一个负号.得到公式如下:

求解步骤如下:

 1-随机一组W.

 2-将W带入交叉熵损失函数,让得到的点沿着负梯度的方向移动.

 3-循环第二步.


为什么要用log:

样本集中有很多样本,要求其概率连乘,概率为(0,1)间的数,连乘越来越小,利用log变换将其变为连加,不会溢出,不会超出计算精度



我跑了一个简单的数字组合回测

from numpy import *
filename=r'F:\nlp_git\Text.txt' #文件目录
def loadDataSet(): #读取数据(这里只有两个特征)
dataMat = []
labelMat = []
fr = open(filename)
for line in fr.readlines():
line = line.strip().split()
dataMat.append([1.0,float(line[0]),float(line[1])]) #前面的1,表示方程的常量。比如两个特征X1,X2,共需要三个参数,W1+W2*X1+W3*X2
labelMat.append(int(line[2]))
fr.close()
return dataMat,labelMat


def sigmoid(inX): #sigmoid函数
return 1.0/(1+exp(-inX))

 def gradAscent(dataMat, labelMat): #梯度上升求最优参数
dataMatrix=mat(dataMat) #将读取的数据转换为矩阵
classLabels=mat(labelMat).transpose() #将读取的数据转换为矩阵
m,n = shape(dataMatrix)
alpha = 0.001 #设置梯度的阀值,该值越大梯度上升幅度越大
maxCycles = 500 #设置迭代的次数,一般看实际数据进行设定,有些可能200次就够了
weights = ones((n,1)) #设置初始的参数,并都赋默认值为1。注意这里权重以矩阵形式表示三个参数。
for k in range(maxCycles):
h = sigmoid(dataMatrix*weights)
        error = (classLabels - h)     #求差值
weights = weights + alpha * dataMatrix.transpose()* error #迭代更新权重
return weights

    
def plotBestFit(weights): #画出最终分类的图
import matplotlib.pyplot as plt
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 main():
dataMat, labelMat = loadDataSet()
weights=gradAscent(dataMat, labelMat).getA()
plotBestFit(weights)


if __name__=='__main__':
main()


及如果如下


其实现在已经有很多成熟的机器学习包 skleran等 

文章转载自量化分析之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论