6.1确认逻辑斯蒂分布属于指数分布族:确认
6.2逻辑斯蒂回归模型的梯度下降法
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
class Logistic():
def __init__(self,X,Y):
self.X = np.c_[X,np.ones(X.shape[0])]
self.Y = Y
self.w = np.zeros(self.X.shape[1])
def prob(self,w,xin):
prb = 1.0/(1+np.exp(-np.dot(w,xin)))
return 1-prb,prb
def training(self,e,rate):
def Lw(X,Y,w):
sum = 0.0
for i,yi in enumerate(Y):
sum += yi*np.dot(w,X[i])-np.log(1+np.exp(np.dot(w,X[i])))
return sum
def gradient(X,Y,w):
sum = np.zeros(X.shape[1])
for i,xi in enumerate(X):
_,prb = self.prob(w,xi)
sum += xi*(Y[i] - prb)
return sum
#附录A 梯度下降
#第一步初始化
X = self.X
Y = self.Y
w = self.w
prelw = 0
gw = 0
gwf = float("inf")#直接进入迭代
#当梯度范数小于e时停止迭代
while gwf > e :#可以加上最大迭代次数
w += rate*gw
#计算L(w)
nowlw = Lw(X, Y, w)
print(w)
#当前后的似然函数变化小于e时停止迭代
if abs(prelw-nowlw) < e:
break
else:
prelw = nowlw
#计算梯度
gw = gradient(X, Y, w)
#梯度范数
gwf = np.linalg.norm(gw,ord=2)
print("success")
self.w = w
print(w)
def main():
np.random.seed(12)
num_observations = 5000
#这是数据集,这是借鉴的
x1 = np.random.multivariate_normal([0, 0], [[1, .75],[.75, 1]], num_observations)
x2 = np.random.multivariate_normal([1, 4], [[1, .75],[.75, 1]], num_observations)
X &