首页 > 编程语言 > 详细

Logisitic Regression(对率回归/逻辑回归)【python实现】

时间:2020-05-02 23:27:12      阅读:94      评论:0      收藏:0      [点我收藏+]

名为回归,其实为一种分类算法

数据集:

\[D = \lbrace x_i, y_i \rbrace i = 1, 2 , ..., n \]

其中

\[x_i = (x_{i1}; x_{i2}; ...; x_{im}) \]

即每个样本有m个属性

\[y_i = \begin{cases} 1 , & \text{属于1类}\\ 0 , & \text{属于0类, i = 1, 2, ..., n} \end{cases} \]

\[\hat x_i = (x_{i1}; x_{i2}; ...; x_{im};1) \]

使用sigmoid函数

\[y = \frac{1}{1+exp(z)} \]

\[z = \omega ^Tx + b \]

令:

\[X = [\hat x_1^T;\hat x_2^T; ...; \hat x_n^T] \]

\[Y = [y_1; y_2; ...; y_n] \]

将分类函数化简,利用极大似然估计求\(\omega ^*\)

\[\omega ^*= (\omega _1; \omega _2; ...; \omega _m;b) \]

利用牛顿法求极大似然函数极值,解出\(\omega ^*\)

python程序

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D
M = 3 #属性个数+1       属性加 偏移项b, 一个3个参数
N = 50#二分类。每类样本N个
#随机生成两个属性的N个第一类样本
feature11 = np.random.randint(0, 10, size = N)
feature12 = np.random.randint(0, 5, size= N)
splt = np.ones((1, N))
temp_X11 = np.row_stack((feature11, feature12))
temp_X1 = np.vstack((temp_X11, splt))
X_t1 = np.mat(temp_X1)
X1 = X_t1.T 
Y1 = np.mat(np.zeros((N, 1)))
#随机生成两个属性的N个第二类样本
feature21 = np.random.randint(0,10, size= N)
feature22 = np.random.randint(6, 10, size= N)
splt = np.ones((1, N))
temp_X21 = np.row_stack((feature21, feature22))
temp_X2 = np.vstack((temp_X21, splt))
X_t2 = np.mat(temp_X2)
X2 = X_t2.T 
Y2 = np.mat(np.ones((N, 1)))
#画样本散点图
fig = plt.figure(1)
plt.scatter(feature11, feature12, marker=‘o‘, color = ‘b‘)
plt.scatter(feature21, feature22, marker=‘*‘, color = ‘y‘)
plt.xlabel(‘feature1‘)
plt.ylabel(‘feature2‘)
plt.title(‘samples‘)
#牛顿迭代法,求Omega
X = np.vstack((X1, X2))
Y = np.vstack((Y1, Y2))
Omega = np.mat(np.zeros((M, 1)))
Epsilon = 0.001  #输出精度
Delta = 1
counts =0
while Delta > Epsilon :
    counts += 1
    df = np.mat(np.zeros((M, 1)))
    d2f = np.mat(np.zeros((3)))
    for i in range(2*N) :
        f = X[i, :]*Omega
        p1 = np.math.exp(f) / (1 + np.math.exp(f))
        df -= X[i, :].T*(Y[i, 0] - p1)
        d2f = d2f + X[i, :].T*X[i, :]*p1*(1 - p1)
    Omega = Omega - np.linalg.pinv(d2f)*df
    Delta = np.linalg.norm(df)
    #print(Omega, end=‘\n‘)
    #print("迭代次数{}, Delta = {}".format(counts, Delta), end=‘\n‘)
#分类函数
def Classficate(sample):
    f = Omega.T*sample
    y = 1/(1+np.math.exp(-f))
    return y
#画分类面
K = 50
xx = np.linspace(0,10, num= K)
yy = np.linspace(0,10, num= K)
xx_1, yy_1 = np.meshgrid(xx, yy)
Omega_h = np.array(Omega.T)
r = np.exp(-(Omega_h[0, 0]*xx_1 + Omega_h[0, 1]*yy_1 + Omega_h[0, 2]))
zz_1 = 1/(1 + r)
fig = plt.figure(2)
ax1 = Axes3D(fig)
ax1.plot_surface(xx_1, yy_1, zz_1, alpha= 0.6, color= ‘r‘)
ax1.set_xlabel(‘feature1‘)
ax1.set_ylabel(‘feature2‘)
ax1.set_zlabel(‘class‘)
ax1.set_title(‘LogisiticRegression model‘)
plt.show()

结果

数据集

技术分享图片

分类面

技术分享图片

参考资料

1.《机器学习》线性模型一章 周志华老师
2.梯度下降法、牛顿法和拟牛顿法

Logisitic Regression(对率回归/逻辑回归)【python实现】

原文:https://www.cnblogs.com/liudianfengmang/p/12820157.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!