本文主要使用了对数几率回归法与线性判别法(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. Sql Server中使用存储过程来实现一些时间差的改变

    Sql Server中的时间差是使用DATEDIFF来是现的 语法如下:DATEDIFF(要显示时间格式,开始时间,结束时间) 比如:DATEDIFF(minute,'2019-2-28 8:30', ...

  2. hdu X问题 (中国剩余定理不互质)

    http://acm.hdu.edu.cn/showproblem.php?pid=1573 X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory ...

  3. Java多线程编程:Callable、Future和FutureTask浅析(多线程编程之四)

    java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)java多线程同步以及线程间通信详解&消费者生产者模式&死锁& ...

  4. c语言博客作业01—分支、顺序结构

    1.本章学习总结  1.1 思维导图  1.2本章学习体会及代码量学习体会  1.2.1学习体会 这周 对c语言的学习 明显与其他同学相比较有些滞后,觉得很大原因是暑假没有看教学视频,课前没有预习课本 ...

  5. eclipse的debug模式经常自动跳到TheadPoolExecutor的断点

    1.问题:eclipse的debug模式经常自动跳到TheadPoolExecutor的断点,实在烦人 解决方法是: 在eclipse中选择Window->Preference->Java ...

  6. tushare模块的应用

    一.简介以及环境安装 TuShare是一个著名的免费.开源的python财经数据接口包.其官网主页为:TuShare -财经数据接口包.该接口包如今提供了大量的金融数据,涵盖了股票.基本面.宏观.新闻 ...

  7. Python str转化成数字

    原地址 http://www.cnblogs.com/wuxiangli/p/6046800.html   int(x [,base ])         将x转换为一个整数     long(x [ ...

  8. C#-WebForm-网页中Form表单中给回车绑定按钮

    WEB端:     <form id="form1" runat="server" defaultbutton="btnSearch" ...

  9. flask _bootstrap中使用flash

    在模板中获取flash闪现的那段代码要和内容块放在同一级别上.不然网页上是看不到闪现的内容的. 比如在基模板里定义一个content block ,里面一个是get_flashed_messages代 ...

  10. JAVA编程思想第一章——对象导论