【python手写算法】逻辑回归实现分类(含公式推导)

公式推导:

代码实现:

python 复制代码
# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np

def f(w1,x1,w2,x2,b):
    z=w1*x1+w2*x2+b
    return 1/(1+np.exp(-z))
if __name__ == '__main__':
    X1 =[12.46, 0.25, 5.22, 11.3, 6.81, 4.59, 0.66, 14.53, 15.49, 14.43,
        2.19, 1.35, 10.02, 12.93, 5.93, 2.92, 12.81, 4.88, 13.11, 5.8,
         29.01, 4.7, 22.33, 24.99, 18.85, 14.89, 10.58, 36.84, 42.36, 39.73,
        11.92, 7.45, 22.9, 36.62, 16.04, 16.56, 31.55, 20.04, 35.26, 23.59]
    X2 =[29.01, 4.7, 22.33, 24.99, 18.85, 14.89, 10.58, 36.84, 42.36, 39.73,
        11.92, 7.45, 22.9, 36.62, 16.04, 16.56, 31.55, 20.04, 35.26, 23.59,
         12.46, 0.25, 5.22, 11.3, 6.81, 4.59, 0.66, 14.53, 15.49, 14.43,
         2.19, 1.35, 10.02, 12.93, 5.93, 2.92, 12.81, 4.88, 13.11, 5.8]
    Y= []
    for i in range(len(X1)):
        if X1[i]+X2[i]<20:Y.append(0)
        else:Y.append(1);

    w1=1
    w2=-1
    b=2
    a=5 # 学习率
    w1_temp=-100
    w2_temp = -100
    b_temp=-100
    w1change = 100
    w2change = 100
    bchange = 100
    while abs(w1change)>1e-6 and abs(w2change)>1e-6 and abs(bchange)>1e-6:
        print(w1change)
        w1change=0
        w2change=0
        bchange=0
        for i in range(len(X1)):
            w1change+=(f(w1,X1[i],w2,X2[i],b)-Y[i])*X1[i]
            w2change += (f(w1,X1[i],w2,X2[i],b) - Y[i]) * X2[i]
            bchange+=(f(w1,X1[i],w2,X2[i],b) - Y[i])
        w1change/=len(X1)
        w2change /= len(X2)
        bchange /= len(X1)
        w1_temp=w1-a*w1change
        w2_temp = w2 - a * w2change
        b_temp=b-a*bchange
        w1=w1_temp
        w2 = w2_temp
        b=b_temp
    print("y=%.4f*x1+%.4f*x2+%.4f" % (w1,w2, b))



    X1_1 = []
    X1_2 = []
    X2_1 = []
    X2_2 = []
    for i in range(len(X1)):
        if(Y[i]==0):
            X1_1.append(X1[i])
            X2_1.append(X2[i])
        else:
            X1_2.append(X1[i])
            X2_2.append(X2[i])
    print(X1_1)
    # 简单画图显示
    plt.scatter(X1_1, X2_1, c="blue")
    plt.scatter(X1_2, X2_2, c="red")

    x = np.linspace(0, 40, 200)  # 在0到50之间生成100个等间距的值
    y=(w1*x+b)/(-w2)
    plt.plot(x,y)

    plt.show()

效果还不错,我感觉逻辑回归的最佳学习率要比线性回归最佳学习率大多了。

相关推荐
IVEN_1 小时前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈
AI软著研究员1 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish1 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
Ray Liang2 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
颜酱2 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
AI攻城狮2 小时前
如何给 AI Agent 做"断舍离":OpenClaw Session 自动清理实践
python
千寻girling2 小时前
一份不可多得的 《 Python 》语言教程
人工智能·后端·python
AI攻城狮5 小时前
用 Playwright 实现博客一键发布到稀土掘金
python·自动化运维
曲幽6 小时前
FastAPI分布式系统实战:拆解分布式系统中常见问题及解决方案
redis·python·fastapi·web·httpx·lock·asyncio