python底层的逻辑回归

python底层的逻辑算法:
回归:回归是统计学的一个重要概念,其本意是根据之前的数据预测一个准确的输出值。
逻辑回归是《机器学习》这门课的第三个算法,它是目前使用最为广泛的一种学习算法,用于解决分类问题。与线性回归算法一样,也是监督学习算法。
诸如:新闻分类、基因序列、市场划分等的一些根据特征划分的,用的都是逻辑回归。
输出的最终预测结果为:正向类(1)、负向类(0)。

逻辑回归模型是一个“S”形的函数:

在这里插入图片描述预测值
代价函数:代价函数 — 误差的平方和 — 非凸函数—局部最小点 。
代价函数
梯度下降
在这里插入图片描述
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
train_data=np.loadtxt(r'LoR_linear.txt',delimiter=',')
test_data=np.loadtxt(r'LoR_nonlinear.txt',delimiter=',')

train_X,train_y=train_data[:,:-1],train_data[:,-1]
test_X,test_y=test_data[:,:-1],test_data[:,-1]

def preProess(X,y):
    #特征缩放
    X -=np.mean(X,axis=0)
    X /=np.std(X,axis=0,ddof=1)

    X=np.c_[np.ones(len(X)),X]
    y=np.c_[y]
    return X,y

train_X,train_y=preProess(train_X,train_y)
test_X,test_y=preProess(test_X,test_y)

def g(x):
    return 1/(1+np.exp(-x))
x=np.linspace(-10,10,500)
y=g(x)
plt.plot(x,y)
plt.show()
def model(X,theta):
    z=np.dot(X,theta)
    h=g(z)
    return h

def costFunc(h,y):
    m=len(y)
    J=-(1.0/m)*np.sum(y*np.log(h)+(1-y)*np.log(1-h))
    return J

def gradDesc(X,y,max_iter=15000,alpha=0.1):
    m,n=X.shape
    theta=np.zeros((n,1))
    J_history=np.zeros(max_iter)

    for i in range(max_iter):
        h=model(X,theta)
        J_history[i]=costFunc(h,y)
        deltaTheta = (1.0/m)*np.dot(X.T,h-y)
        theta -= deltaTheta*alpha

    return J_history,theta

def score(h,y):
    m=len(y)
    count=0
    for i in range(m):
        h[i]=np.where(h[i]>=0.5,1,0)
        if h[i]==y[i]:
            count+=1
    return count/m
#预测结果函数,结果不是0就是1
def predict(h):
    y_pre=[1 if i>=0.5 else 0 for i in h]
    return y_pre

print(train_X.shape,train_y.shape)
J_history,theta=gradDesc(train_X,train_y)
print(theta)
plt.title("代价函数")
plt.plot(J_history)
plt.show()

train_h=model(train_X,theta)
test_h=model(test_X,theta)
print(train_h,test_h)

def showDivide(X,theta,y,title):
    plt.title(title)
    plt.scatter(X[y[:,0]==0,1],X[y[:,0]==0,2],label="负样本")
    plt.scatter(X[y[:,0]==1,1],X[y[:,0]==1,2],label="正样本")
    min_x1,max_x1=np.min(X),np.max(X)
    min_x2,max_x2=-(theta[0]+theta[1]*min_x1)/theta[2],-(theta[0]+theta[1]*max_x1)/theta[2]
    plt.plot([min_x1,max_x1],[min_x2,max_x2])
    plt.legend()
    plt.show()

showDivide(train_X,theta,train_y,'训练集')
showDivide(test_X,theta,test_y,'测试集集')

train_y1=predict(train_h)
print('预测的结果是:',train_y1)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值