对数几率回归法(梯度下降法,随机梯度下降与牛顿法)与线性判别法(LDA)
本文主要使用了对数几率回归法与线性判别法(LDA)对数据集(西瓜3.0)进行分类。其中在对数几率回归法中,求解最优权重W时,分别使用梯度下降法,随机梯度下降与牛顿法。
代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2017-05-09 15:03:50
# @Author : whb (whb@bupt.edu.cn)
# @Link : ${link}
# @Version : $Id$ import numpy as p
import matplotlib.pyplot as plt
import pandas as pd
import random
from scipy.linalg import solve,inv def read_data(file_name):
train_data = pd.read_excel(file_name) # 得到一个数据框(每一列代表一个实例)
return[list(train_data.ix[0]), list(train_data.ix[1]), list(train_data.ix[2]), list(train_data.ix[3])]
###算法##
# 1 对数几率回归
def func(x, y, w):
#'x为样本,y为样本类别,w为权重+偏向'
n = len(x[0]) # 训练集个数
m = len(x) # 每个实例的属性个数 m-1
result = 0
for i in xrange(n):
s = 0
for j in xrange(m):
s += x[j][i] * w[j]
result += -y[i] * (s) + p.log(1 + p.exp(s))
return result def p1(x, w):
# 后验概率估计
wx = 0
for i in xrange(len(x)):
wx += w[i] * x[i]
return p.exp(wx) / (1 + p.exp(wx)) def dfunc(x, y, w):
# 一阶导数
df = p.zeros(len(x))
for i in xrange(len(x[0])):
df += x[:, i] * (y[i] - p1(x[:, i], w))
return -df def d2func(x, y, w):
# 二阶导数
n = len(x[0])
d2f = p.zeros((n, n))
for i in xrange(len(x[0])):
d2f[i][i] = (1 - p1(x[:, i], w)) * p1(x[:, i], w)
return p.mat(x) * p.mat(d2f) * p.mat(x.transpose()) # 牛顿法
def newtown(x, y, w, error, n):
i = 1
while i < n:
d1 = dfunc(x, y, w)
if p.dot(d1, d1) < error:
print '牛顿法: 迭代 ' + str(i) + '步:w=', w
return w
break
w = w - solve(d2func(x, y, w), dfunc(x, y, w))
i += 1 # 梯度下降法
def gradienet_down(x, y, w, error, n):
i = 1
h = 0.1
while i < n:
start1 = func(x, y, w)
df = dfunc(x, y, w)
w = w - h * df
start2 = func(x, y, w)
if abs(start1 - start2) < error:
print '梯度下降法:迭代 ' + str(i) + '步:w=', w
return w
break
i += 1 #随机梯度下降算法
def SGD(x, y, w, error, n):
i = 1
h = 0.1
while i < n: start1 = func(x, y, w) x_set=range(17)
random.shuffle(x_set) #随机洗牌
for k in x_set: #只使用一个样本更新权重
df = -x[:, k] * (y[k] - p1(x[:, k], w))
w = w - h * df
start2 = func(x, y, w)
if abs(start1 - start2) < error:
print '随机梯度法: 迭代' + str(i) + '步:w=', w
return w
break
i += 1 #LDA线性判别法
def LDA(x,y):
x=p.mat(x[:2])
u0=p.zeros((2,1))
m0=0
u1=p.zeros((2,1))
m1=0
for j in xrange(len(y)):
if y[j]==1:
u1 += x[:,j]
m1 +=1
else:
u0 += x[:,j]
m0 +=1
u0=u0/m0 #均值
u1=u1/m1
sum_=p.zeros((2,2)) #类内方差矩阵。
for i in xrange(17):
if y[i]==1:
sum_ += (x[:,i]-u1)*(p.mat(x[:,i]-u1).T)
else:
sum_ += (x[:,i]-u0)*(p.mat(x[:,i]-u0).T)
return inv(sum_)*p.mat(u0-u1) #可视化
def result_plot(x,y,w_min):
x1 = p.arange(0, 0.8, 0.01)
y1 = [-(w_min[2] + w_min[0] * x1[k]) / w_min[1] for k in xrange(len(x1))]
color = ['r'] * y.count(1.) + ['b'] * y.count(0.)
plt.scatter(x[0], x[1], c=color)
plt.plot(x1, y1) if __name__ == '__main__':
file_name = 'xigua.xls'
data = read_data(file_name)
x = data[:3] # 各实例的属性值
x = p.array(x)
y = data[-1] # 类别标记
w = [1, 1, 1] # 初始值
error = 0.0001 # 误差
n = 1000 # 迭代步数 w_min=newtown(x,y,w,error,n) w_min1= gradienet_down(x, y, w, error, n) w_min11=SGD(x, y, w, error, n) w_min2=LDA(x, y) w_min2=[w_min2[0,0],w_min2[1,0],0]
# 可视化
plt.figure(1)
plt.subplot(221)
result_plot(x,y,w_min)
plt.title(u'牛顿法')
plt.subplot(222)
result_plot(x,y,w_min1)
plt.title(u'梯度下降法')
plt.subplot(223)
result_plot(x,y,w_min11)
plt.title(u'随机梯度下降法')
plt.subplot(224)
result_plot(x,y,w_min2)
plt.title(u'LDA')
plt.show()
结果:
牛顿法: 迭代 5步:w= [ 3.14453235 12.52792035 -4.42024654]
梯度下降法:迭代 838步:w= [ 2.80637226 11.14036869 -3.95330427]
随机梯度法: 迭代182步:w= [ 1.84669379 6.02658819 -2.31718771]

对数几率回归法(梯度下降法,随机梯度下降与牛顿法)与线性判别法(LDA)的更多相关文章
- 对数几率回归(逻辑回归)原理与Python实现
目录 一.对数几率和对数几率回归 二.Sigmoid函数 三.极大似然法 四.梯度下降法 四.Python实现 一.对数几率和对数几率回归 在对数几率回归中,我们将样本的模型输出\(y^*\)定义 ...
- 机器学习总结-LR(对数几率回归)
LR(对数几率回归) 函数为\(y=f(x)=\frac{1}{1+e^{-(w^{T}x+b)}}\). 由于输出的是概率值\(p(y=1|x)=\frac{e^{w^{T}x+b}}{1+e^{w ...
- 梯度下降法(BGD、SGD)、牛顿法、拟牛顿法(DFP、BFGS)、共轭梯度法
一.梯度下降法 梯度:如果函数是一维的变量,则梯度就是导数的方向: 如果是大于一维的,梯度就是在这个点的法向量,并指向数值更高的等值线,这就是为什么求最小值的时候要用负梯度 梯度下降法(Gr ...
- 学习笔记TF009:对数几率回归
logistic函数,也称sigmoid函数,概率分布函数.给定特定输入,计算输出"success"的概率,对回题回答"Yes"的概率.接受单个输入.多维数据或 ...
- sklearn中实现随机梯度下降法(多元线性回归)
sklearn中实现随机梯度下降法 随机梯度下降法是一种根据模拟退火的原理对损失函数进行最小化的一种计算方式,在sklearn中主要用于多元线性回归算法中,是一种比较高效的最优化方法,其中的梯度下降系 ...
- A-02 梯度下降法
目录 梯度下降法 一.梯度下降法详解 1.1 梯度 1.2 梯度下降法和梯度上升法 1.3 梯度下降 1.4 相关概念 1.4.1 步长 1.4.2 假设函数 1.4.3 目标函数 二.梯度下降法流程 ...
- ubuntu之路——day8.1 深度学习优化算法之mini-batch梯度下降法
所谓Mini-batch梯度下降法就是划分训练集和测试集为等分的数个子集,比如原来有500W个样本,将其划分为5000个baby batch,每个子集中有1000个样本,然后每次对一个mini-bat ...
- 谷歌机器学习速成课程---3降低损失 (Reducing Loss):梯度下降法
迭代方法图(图 1)包含一个标题为“计算参数更新”的华而不实的绿框.现在,我们将用更实质的方法代替这种华而不实的算法. 假设我们有时间和计算资源来计算 w1 的所有可能值的损失.对于我们一直在研究的回 ...
- 梯度下降法(BGD & SGD & Mini-batch SGD)
梯度下降法(Gradient Descent) 优化思想:用当前位置的负梯度方向作为搜索方向,亦即为当前位置下降最快的方向,也称“最速下降法”.越接近目标值时,步长越小,下降越慢. 如下图所示,梯度下 ...
随机推荐
- pipeline构建时报错问题解决
问题: 1.No such field found: field java.lang.String sh. Administrators can decide whether to approve o ...
- VC6.0快捷键一览表
F1 显示帮助,如果光标停在代码的某个字符上,显示MSDN中相应的帮助内容 F2 书签功能: Ctrl+F2 –在某行设置一个书签(再按一次次是取消) F2 –跳到下一个书签位置 Shift+F2 – ...
- 各位客官!鼠标点击一个Button之后究竟发生了什么?您知道么?(C#)
在谈论主题之前,让我们先简单回顾下事件的基础知识吧! 我们知道事件有发出(raises)事件的源,即event sender,也有接收事件通知(notifications)的接收者,即event re ...
- 原生 javaScript 百叶窗 效果的实现及原理介绍
百叶窗大家都见过吧!如图: 原理: 如图所示,空心格子就好比是每个li,给它设定相对定位属性,设置overflow:hidden: 黑块为li子元素,高度为li的2倍,设置absolute属性,我们正 ...
- UWP开发入门(十)——通过继承来扩展ListView
本篇之所以起这样一个名字,是因为重点并非如何自定义控件,不涉及创建CustomControl和UserControl使用的Template和XAML概念.而是通过继承的方法来扩展一个现有的类,在继承的 ...
- 洛谷P1742 最小圆覆盖(计算几何)
题面 传送门 题解 之前只是在抄题解--这篇才算是真正自己想的吧-- 首先我们把输入序列给\(random\)一下防止出题人好心送你一个毒瘤序列 我们设\(r\)为当前最大半径,\(o\)为此时对应圆 ...
- 操作mysql的指令
1,通过ip,端口,用户名,密码登陆数据 命令格式为:mysql -h ip -u root -p -P 3306例如:mysql -h 127.0.0.1 -u root -p -P 3306 2, ...
- npm安装包很慢
每次安装时: 可以通过指定 --registry,指向国内镜像服务器地址来加快安装速度. npm install -gd express --registry=http://registry.npm. ...
- Django中的Session--实现登录
Django中的Session--实现登录 Django Session Session Session 是什么 Session保存在服务端的键值对. 为什么要有 Session Cookie 虽然 ...
- django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes')
环境介绍 Django (2.1) Python 3.5.5 mysqlclient (1.4.2.post1) Mysql 5.6.28 RHEL 7.3 在migrate时候报错 model代码 ...