本文主要使用了对数几率回归法与线性判别法(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)的更多相关文章

  1. 对数几率回归(逻辑回归)原理与Python实现

    目录 一.对数几率和对数几率回归 二.Sigmoid函数 三.极大似然法 四.梯度下降法 四.Python实现 一.对数几率和对数几率回归   在对数几率回归中,我们将样本的模型输出\(y^*\)定义 ...

  2. 机器学习总结-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 ...

  3. 梯度下降法(BGD、SGD)、牛顿法、拟牛顿法(DFP、BFGS)、共轭梯度法

    一.梯度下降法 梯度:如果函数是一维的变量,则梯度就是导数的方向:      如果是大于一维的,梯度就是在这个点的法向量,并指向数值更高的等值线,这就是为什么求最小值的时候要用负梯度 梯度下降法(Gr ...

  4. 学习笔记TF009:对数几率回归

    logistic函数,也称sigmoid函数,概率分布函数.给定特定输入,计算输出"success"的概率,对回题回答"Yes"的概率.接受单个输入.多维数据或 ...

  5. sklearn中实现随机梯度下降法(多元线性回归)

    sklearn中实现随机梯度下降法 随机梯度下降法是一种根据模拟退火的原理对损失函数进行最小化的一种计算方式,在sklearn中主要用于多元线性回归算法中,是一种比较高效的最优化方法,其中的梯度下降系 ...

  6. A-02 梯度下降法

    目录 梯度下降法 一.梯度下降法详解 1.1 梯度 1.2 梯度下降法和梯度上升法 1.3 梯度下降 1.4 相关概念 1.4.1 步长 1.4.2 假设函数 1.4.3 目标函数 二.梯度下降法流程 ...

  7. ubuntu之路——day8.1 深度学习优化算法之mini-batch梯度下降法

    所谓Mini-batch梯度下降法就是划分训练集和测试集为等分的数个子集,比如原来有500W个样本,将其划分为5000个baby batch,每个子集中有1000个样本,然后每次对一个mini-bat ...

  8. 谷歌机器学习速成课程---3降低损失 (Reducing Loss):梯度下降法

    迭代方法图(图 1)包含一个标题为“计算参数更新”的华而不实的绿框.现在,我们将用更实质的方法代替这种华而不实的算法. 假设我们有时间和计算资源来计算 w1 的所有可能值的损失.对于我们一直在研究的回 ...

  9. 梯度下降法(BGD & SGD & Mini-batch SGD)

    梯度下降法(Gradient Descent) 优化思想:用当前位置的负梯度方向作为搜索方向,亦即为当前位置下降最快的方向,也称“最速下降法”.越接近目标值时,步长越小,下降越慢. 如下图所示,梯度下 ...

随机推荐

  1. CI-Excel-Generation-Library php导出excel乱码。

    修改 private function generate($headers, $data) {        $this->set_headers();        $data = " ...

  2. EF查询记录

    public void TestMethod1() { , Ids = , Ids = "4,5,6" } }; , , , , , , , }; var query = quer ...

  3. jQuery限制文本框的输入长度

    jQuery限制文本框输入,包含粘贴. //限制文本框的输入长度 $(function () { $(document).on("keypress", ".txt-val ...

  4. java基础--配置环境变量的意义

    0.jre和jdk jre(java runtime environment) 运行java程序要用的Java运行环境 jdk:java开发人员要用的java开发环境,包括jre 1.JAVA_HOM ...

  5. RoadFlowCore工作流引擎快速入门

    RoadFlow新建一个流程分为以下几步: 1.建表 在数据库建一张自己的业务表(根据你自己的业务需要确定表字段,如请假流程就有,请假人.请假时间.请假天数等字段),数据表必须要有一个主键,主键类型是 ...

  6. ASP.NET WebAPI 测试文档 (Swagger)

    ASP.NET WebAPI使用Swagger生成测试文档 SwaggerUI是一个简单的Restful API测试和文档工具.简单.漂亮.易用(官方demo).通过读取JSON配置显示API .项目 ...

  7. AT指令框架的实现

    AT指令概述 AT指令是应用于终端设备与PC应用之间的连接与通信的指令.AT 即Attention.每个AT命令行中只能包含一条AT指令:对于AT指令的发送,除AT两个字符外,最多可以接收1056个字 ...

  8. PHP set_error_handler()函数的使用

    我们写程序,难免会有问题(是经常会遇到问题 ),而PHP遇到错误时,就会给出出错脚本的位置.行数和原因.有很多人说,这并没有什么大不了.确实,在调试程序阶段,这确实是没啥的,而且我认为给出错误路径是必 ...

  9. ubuntu下apache2使用的简单总结

        一. 修改apache2原80端口为90端口 1. 修改/etc/apache2/ports.conf, 将端口80改为90,443,改为444 2. 修改/etc/apache2/sites ...

  10. java爬虫中jsoup的使用

    jsoup可以用来解析HTML的内容,其功能非常强大,它可以向javascript那样直接从网页中提取有用的信息 例如1: 从html字符串中解析数据 //直接从字符串中获取 public stati ...