非线性回归(Non-linear Regression)学习笔记

非线性回归(Non-linear Regression)

1.概率:
1.1定义概率§robability:对一件事情发生的可能性的衡量
1.2范围 0<=P<=1
1.3计算方法:
1.3.1根据个人置信
1.3.2根据历史数据
1.3.3根据模拟数据
1.4条件概率:(A发生的条件下B发生的概率)
在这里插入图片描述
逻辑回归(Logistic Regression)
x∈(-∞,+∞),y∈(0,1)
2.1举例:
非线性回归(Non-linear Regression)学习笔记_第1张图片
画出线性回归线,计算h(x)值若大于0.5,则认为是Malignant.
特殊例子,出现一个偏离较大的数值:
非线性回归(Non-linear Regression)学习笔记_第2张图片
h(x)>0.5(恶性),Malignant=1
再重新模拟后的线性方程就无法准确分类了

2.2基本模型
测试数据为X (x0, x1, x2.xn)
要学习的参数为: θ(θ0, θ1, θ2,… θn) (θ可作为一个向量)
在这里插入图片描述
向量表示:(θ^T 为一列排列的θ)
在这里插入图片描述
处理二值数据,引入Sigmoid函数时曲线平滑化:
在这里插入图片描述
非线性回归(Non-linear Regression)学习笔记_第3张图片
预测函数:
在这里插入图片描述
θ为参数,X为自变量

用概率表示
正例(y=1):(对于给定的一组数据自变量和一组参数,y=1的概率)
在这里插入图片描述
反例(y=0):(对于给定的一组数据自变量和一组参数,y=0的概率)
在这里插入图片描述
2.3 Cost函数
线性回归:
非线性回归(Non-linear Regression)学习笔记_第4张图片
在这里插入图片描述
y(i)为实例的值)x(i)为每一个实例的自变量,求出的hθ(x(i)即为预测值y_hat
在这里插入图片描述
找到合适的θO,θ1使_上式最小,求导数使其为0,即可求得

Logistic regression:
Cost函数:
(使用对数log的原因:对数是个增函数,很容易求出最大值和最小值,对原函数最大/最小化和对原函数它的对数最大化和最小化是一样的?可以使运算简单很多)
非线性回归(Non-linear Regression)学习笔记_第5张图片
下方程由上面两个方程合成得到(分y=1和y=0)
目标: 找到合适的θO,θ1使_上式J(θ)最小,求导数使其为0,即可求得
方法:数学上一般对其变量求偏导,是其偏导等于0

2.4解法:梯度下降(gradient decent)
一个计算机中非常重要的算法
梯度下降法是用负梯度方向为搜索方向的,最速下降法越接近目标值,步长越小,前进越慢。可以用于求解非线性方程组。
梯度下降法的计算过程就是沿梯度下降的方向求解极小值。
非线性回归(Non-linear Regression)学习笔记_第6张图片
非线性回归(Non-linear Regression)学习笔记_第7张图片
求偏导(求出斜率)找到曲面的最低点
(以θ对J求导数,α为学习率可能会随时变更,)
更新法则(化简上式后):(i上标表示不同的实例)
在这里插入图片描述
同时对所有的0进行更新
重复更新直到收敛(低于设置的预测值,一般为local minimum or global minimum)

非线性回归实例应用(Logistic Regression Application):

import numpy as np
import random

# 一个函数为梯度下降的算法
def GradientDescent(x,y,theta,alpha,m,numInterations):# m denotes the number of examples here, not the number of features
    '''x:实例;y:分类标签'''
    '''theta:要学习的参数θ'''
    '''alpha:learning rate'''
    '''m:更新法则公式中实例的个数,对应矩阵的维数[]'''
    '''numInterations:使用此方法循环训练更新的次数'''
    xTrans = x.transpose() #转置x便于后面运算
    for i in range(0,numInterations):
        hypothesis = np.dot(x,theta) #这里为什么要放在for循环里面,并不受循环影响? #for循环次数即为更新次数
        loss = hypothesis - y #hypothesis其实就是y_hat,这里loss就等于y_hat减去y(实际)
        # avg cost per example (the 2 in 2*m doesn't really matter here.
        # But to be consistent with the gradient, I include it
        cost = np.sum(loss**2)/(2*m)#这里的cost函数与课文中提到的cost函数不一样,这里使用了一个简单的cost便于计算
        '''cost:对精确度的衡量,每一次gradient都会减小'''
        print('Interation:%d|cost:%f'%(i,cost))
        # avg gradient per example
        gradient = np.dot(xTrans,loss)/m #每一次的下降梯度值,除以m:取平均
        # updata
        theta = theta-alpha*gradient  #即更新法则的公式:θ=θ-α∑(h(x)-y)x
    return theta

# 一个函数用来产生数据用来测试拟合
def genData(numPoints,bias,variance):
    '''numPoints:实例的行数(矩阵形式,每一行对应一对实例)'''
   ''' bias:生成y时产生一个偏差值'''
   ''' variance:方差'''
    x = np.zeros(shape=(numPoints,2)) #numPoints行,2列的矩阵
    y = np.zeros(shape=(numPoints))
    #basically a staight line
    for i in range(0,numPoints):
        # bias feature
        x[i][0] = 1
        x[i][1] = i
        # target variable
        y[i] = (i+bias)+random.uniform(0,1)*variance #random.uniform(0,1)同random.random()产生0~1随机数
    return x,y

# generate 100 columns with a bias of 25 and 10 variance as a bit of noise
x,y = genData(100,25,10)#前面函数返回了两个变量x,y此处可以任意取两个变量按偏移量赋值给返回的x和y
# print(x)
# print(y)
m,n = np.shape(x) #x的行数赋值给m,列数赋值为n  
a = np.shape(y) #y只有一列不会返回列的数值,会返回行的数值  
# print(m,n) #(100行,2)
# print(a) #(100行,1)

numInterations = 100000
alpha = 0.0005 #取0~1,比较好的算法会设置开始的alpha数值较大后期数值较小
theta = np.ones(n) # 初始化θ:[1. 1.] 为什么设置为1?
theta = GradientDescent(x,y,theta,alpha,m,numInterations)
print(theta) #约为[30 1]

# 得出的theta就可以用于对新实例的计算和预测
#回归算法和神经网络中都会用到此梯度下降的方法

你可能感兴趣的:(非线性回归(Non-linear Regression)学习笔记)