zoukankan      html  css  js  c++  java
  • 梯度下降法实现对数几率回归

      1 import matplotlib.pyplot as plt
      2 import numpy as np
      3 import xlrd
      4 
      5 def sigmoid(x):
      6     """
      7     Sigmoid function.
      8     Input:
      9         x:np.array
     10     Return:
     11         y: the same shape with x
     12     """    
     13     y =1.0 / ( 1 + np.exp(-x))
     14     return y
     15 
     16 def newton(X, y):
     17     """
     18     Input:
     19         X: np.array with shape [N, 3]. Input. 
     20         y: np.array with shape [N, 1]. Label.
     21     Return:
     22         beta: np.array with shape [1, 3]. Optimal params with newton method
     23     """
     24     N = X.shape[0]
     25     #initialization
     26     beta = np.ones((1, 3)) 
     27     #shape [N, 1]
     28     z = X.dot(beta.T)
     29     #log-likehood
     30     old_l = 0
     31     new_l = np.sum(-y*z + np.log( 1+np.exp(z) ) )
     32     iters = 0
     33     while( np.abs(old_l-new_l) > 1e-5):
     34         #shape [N, 1]
     35         p1 = np.exp(z) / (1 + np.exp(z))
     36         #shape [N, N]
     37         p = np.diag((p1 * (1-p1)).reshape(N))
     38         #shape [1, 3]
     39         first_order = -np.sum(X * (y - p1), 0, keepdims=True)
     40         #shape [3, 3]
     41         second_order = X.T .dot(p).dot(X)
     42 
     43         #update
     44         beta -= first_order.dot(np.linalg.inv(second_order))
     45         z = X.dot(beta.T)
     46         old_l = new_l
     47         new_l = np.sum(-y*z + np.log( 1+np.exp(z) ) )
     48 
     49         iters += 1
     50     print "iters: ", iters
     51     print new_l 
     52     return beta
     53 
     54 def gradDescent(X, y):
     55     """
     56     Input:
     57         X: np.array with shape [N, 3]. Input. 
     58         y: np.array with shape [N, 1]. Label.
     59     Return:
     60         beta: np.array with shape [1, 3]. Optimal params with gradient descent method
     61     """
     62 
     63     N = X.shape[0]
     64     lr = 0.05
     65     #initialization
     66     beta = np.ones((1, 3)) * 0.1
     67     #shape [N, 1]
     68     z = X.dot(beta.T)
     69 
     70     for i in range(150):
     71         #shape [N, 1]
     72         p1 = np.exp(z) / (1 + np.exp(z))
     73         #shape [N, N]
     74         p = np.diag((p1 * (1-p1)).reshape(N))
     75         #shape [1, 3]
     76         first_order = -np.sum(X * (y - p1), 0, keepdims=True)
     77 
     78         #update
     79         beta -= first_order * lr
     80         z = X.dot(beta.T)
     81 
     82     l = np.sum(-y*z + np.log( 1+np.exp(z) ) )
     83     print l 
     84     return beta
     85 
     86 if __name__=="__main__":
     87 
     88     #read data from xlsx file
     89     workbook = xlrd.open_workbook("3.0alpha.xlsx")
     90     sheet = workbook.sheet_by_name("Sheet1")
     91     X1 = np.array(sheet.row_values(0))
     92     X2 = np.array(sheet.row_values(1))
     93     #this is the extension of x
     94     X3 = np.array(sheet.row_values(2)) 
     95     y = np.array(sheet.row_values(3))
     96     X = np.vstack([X1, X2, X3]).T
     97     y = y.reshape(-1, 1)
     98 
     99     #plot training data
    100     for i in range(X1.shape[0]):
    101         if y[i, 0] == 0:           
    102             plt.plot(X1[i], X2[i], 'r+')
    103 
    104         else:
    105             plt.plot(X1[i], X2[i], 'bo')
    106 
    107     #get optimal params beta with newton method 
    108     beta = newton(X, y)
    109     newton_left = -( beta[0, 0]*0.1 + beta[0, 2] ) / beta[0, 1]
    110     newton_right = -( beta[0, 0]*0.9 + beta[0, 2] ) / beta[0, 1]
    111     plt.plot([0.1, 0.9], [newton_left, newton_right], 'g-')
    112 
    113     #get optimal params beta with gradient descent method
    114     beta = gradDescent(X, y)
    115     grad_descent_left = -( beta[0, 0]*0.1 + beta[0, 2] ) / beta[0, 1]
    116     grad_descent_right = -( beta[0, 0]*0.9 + beta[0, 2] ) / beta[0, 1]
    117     plt.plot([0.1, 0.9], [grad_descent_left, grad_descent_right], 'y-')
    118 
    119     plt.xlabel('density')
    120     plt.ylabel('sugar rate')
    121     plt.title("LR")
    122     plt.show()

  • 相关阅读:
    IBM WebSphere MQ 7.5基本用法
    IBM WebSphere MQ介绍安装以及配置服务详解
    Windows平台上使用Github搭建Git服务器的图文教程
    Git安装和TortoiseGit详细使用教程【基础篇】
    DOS命令之at命令详解
    单元测试数据库 -- 使用事物回滚测试
    VS中实时获取SVN的版本号并写入到AssemblyInfo.cs中
    SQL2008中Merge的用法
    VS版本号定义、规则和相关的Visual Studio插件
    JSON字符串互相转换的三种方式和性能比较
  • 原文地址:https://www.cnblogs.com/ku1274755259/p/11108522.html
Copyright © 2011-2022 走看看