
首先我们先简单了解一下线性回归,
线性回归
利用大量的样本
,通过有监督的学习,学习到由x到y的映射f,利用该映射关系对未知的数据进行预估,因为y为连续值,所以是回归问题。
。


线性回归的假设函数:
向量形式(
某些数据是线性可分的
某些数据线性不可分。如图2.5右所示:无法训练出一条线性直线将数据区分开
某些数据的线性分类 会导致数据不准确。

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


我们以绿竖线为例,横坐标为肿瘤大小 肿瘤之分类 良性(0) 恶性(1)
大于绿线的为恶性 小于绿线的为良性 我们看到 下图得到的线性回归方程没办法很好的分类该问题。
分类的本质:在空间中找到一个决策边界来完成分类的决策

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



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

我们将 y 视为 x 为正例的概率,则 1-y 为 x 为其反例的概率。两者的比值称为几率(odds),指该事件发生与不发生的概率比值,若事件发生的概率为 p。则对数几率:
将 y 视为类后验概率估计,
也就是说,输出 Y=1 的对数几率是由输入 x 的线性函数表示的模型,这就是逻辑回归模型。当
的值越接近正无穷,
概率值也就越接近 1。因此逻辑回归的思路是,先拟合决策边界(不局限于线性,还可以是多项式),再建立这个边界与分类的概率联系,从而得到了二分类情况下的概率
其优点有:
直接对分类的概率建模,无需实现假设数据分布,从而避免了假设分布不准确带来的问题;
不仅可预测出类别,还能得到该预测的概率,这对一些利用概率辅助决策的任务很有用;
对数几率函数是任意阶可导的凸函数,有许多数值优化算法都可以求出最优解。
逻辑回归模型的数学形式确定后,剩下就是如何去求解模型中的参数。在统计学中,常常使用极大似然估计法来求解,即找到一组参数,使得在这组参数下,我们的数据的似然度(概率)最大。
设:
似然函数:
为了更方便求解,我们对等式两边同取对数,写成对数似然函数:

损失函数:是用来衡量算法的运行情况,优化模型。因为神经网络的目标是最小化代价或者损失
函数最优化的时候习惯让一个函数越小越好,所以我们在前边加一个负号.得到公式如下:
求解步骤如下:
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*X2labelMat.append(int(line[2]))fr.close()return dataMat,labelMatdef 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 weightsdef plotBestFit(weights): #画出最终分类的图import matplotlib.pyplot as pltdataMat,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等




