逻辑回归(非线性回归)

逻辑回归是一种分类算法,用于2元分类两种情况,也可以使用‘一对余’的思想来实现多元分类

sigmoid function、logistic function

sigmoid function、logistic function都是同一种函数,如下:
y = 1 1 + e − x y=\dfrac{1}{1+e^{-x}} y=1+ex1
函数值范围在(0,1),图像如下:
逻辑回归(非线性回归)_第1张图片

假设函数

h θ ( x ) = 1 1 + e − F θ ( x ) h_θ(x)=\dfrac{1}{1+e^{-F_θ(x)}} hθ(x)=1+eFθ(x)1
说明

  • h θ ( x ) h_θ(x) hθ(x)表示条件概率P(y=1|x;θ)(给定参数θ,具有x特征的条件下发生y=1的概率)
  • F θ ( x ) = 0 F_θ(x)=0 Fθ(x)=0为决策边界,决策边界就是区分y=0、1这两种情况的边界。
    如下图:
    逻辑回归(非线性回归)_第2张图片
    − 1 + x 1 2 + x 2 2 = 1 -1+x_1^2+x_2^2=1 1+x12+x22=1为区分o和x的决策边界。该决策边界以外的是y=1的情况,以内是y=0的情况。
    注意,决策边界是假设函数及其参数的一个属性,不是训练集的属性。
    逻辑回归的单样本代价函数
    c o s t ( h θ ( x ) , y ) = { − l o g ( h θ ( x ) ) , y = 1 − l o g ( 1 − h θ ( x ) ) , y = 0 cost(h_θ(x),y)= \begin{cases} -log(h_θ(x)),y=1\\ -log(1-h_θ(x)),y=0\\ \end{cases} cost(hθ(x),y)={log(hθ(x)),y=1log(1hθ(x)),y=0
    可以合并成 c o s t ( h θ ( x ) , y ) = − y l o g ( h θ ( x ) ) − ( 1 − y ) l o g ( 1 − h θ ( x ) ) cost(h_θ(x),y)=-ylog(h_θ(x))-(1-y)log(1-h_θ(x)) cost(hθ(x),y)=ylog(hθ(x))(1y)log(1hθ(x))
    整体代价函数
    J ( θ ) = 1 m c o s t ( h θ ( x ) , y ) J(θ)=\dfrac{1}{m}cost(h_θ(x),y) J(θ)=m1cost(hθ(x),y)

例子代码

import numpy as np
import random 
from dask.array.routines import gradient
from blaze.expr.expressions import shape

# 梯度下降算法,返回接近theta的局部最优解
def gradientDescent(x,y,theta,alpha,m,numIterartions):
    xTrains = x.transpose()  #x转置
    for i in range(0,numIterartions):
        hypothesis = np.dot(x,theta) #hypothesis是y的估计值
        loss = hypothesis - y #误 差
        cost = np.sum(loss **2)/(2*m)
        print("Iteration %d | Cost: %f"%(i,cost))
        gradient = np.dot(xTrains,loss) / m #gradient是梯度
        theta = theta -alpha*gradient
    return theta
#该函数用于构造数据
def genData(numPoints,bias,variance):
    x = np.zeros(shape=(numPoints,2))
    y = np.zeros(shape=numPoints)
    for i in range(0,numPoints):
        x[i][0]=1
        x[i][1]=i
        y[i] = (i + bias) + random.uniform(0,1)*variance
    return x,y
x,y = genData(100, 25, 10)
print("x")
print(x)
print("y")
print(y)
print("x.transpose()")
print(x.T)
m,n = np.shape(x)
n_y  = np.shape(y)
  
print("x shape:"+str(m)+","+str(n))
print("y length:"+str(n_y))

numIterartions = 100000
alpha = 0.0005#学习率
theta = np.ones(n)
# x是实例,y是标记,theta是参数,alpha是学习率,m是实例个数,numIterartions是更新次数
theta = gradientDescent(x, y, theta, alpha, m, numIterartions)
print(theta)

你可能感兴趣的:(machine,learning)