LR算法(python版)

import random
import numpy as np
import matplotlib.pyplot as plt
random.seed(1)
data_0 = np.array([[2 + random.random(), 2 + random.random()] for i in np.arange(6)])
data_1 = np.array([[3 + random.random(), 3 + random.random()] for i in np.arange(6)])
data = np.concatenate((data_0,data_1))
label = np.array([0,0,0,0,0,0,1,1,1,1,1,1])
#边界线方程:a0+a1*x1+a2*x2=0
a0,a1,a2 = 1,1,1 #初始值
alpha = 0.002
threshold = 0.2

def hyp(x1, x2): #假设函数
    return 1/(1+np.exp(-np.matmul(np.array([a0,a1,a2]), np.array([1,x1,x2]))))
def alter(data, label, n_a):
    sum = 0
    if n_a == 0:
        for i in range(len(label)):
            sum += (hyp(data[i][0], data[i][1]) - label[i])
    else:
        for i in range(len(label)):
            sum += (hyp(data[i][0], data[i][1]) - label[i])*data[i][n_a-1]
    return sum*alpha
def loss():
    sum = 0
    for i in range(len(label)):
        sum += label[i]*np.log(hyp(data[i][0], data[i][1])) + (1-label[i])*np.log(1-hyp(data[i][0], data[i][1]))
    return sum / (-len(label))

linex = np.linspace(0,4,5)
for i in range(10000):
    a0 -= alter(data, label, 0)
    a1 -= alter(data, label, 1)
    a2 -= alter(data, label, 2)
    if i % 100 == 0:
        print('第%d次,loss=' % i, loss())
        if i % 1000 == 0:
            liney = (a0 + a1*linex)/(-a2)
            plt.plot(linex, liney, label=i)
        if loss() < threshold:
            break
plt.scatter(data[:,0], data[:,1], c=label)
plt.legend()
plt.show()

                
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值