本文主要使用了对数几率回归法与线性判别法(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. EF按时间范围条件查询

    查询今日数据 db.Table.Where(d => System.Data.Entity.DbFunctions.DiffDays(d.Time, DateTime.Now) == )

  2. UWP开发入门(二)——RelativePanel

    RelativePanel也是Win10 UWP新增的控件,和上篇提到的SplitView一样在UWP的UI布局起到非常重要的作用.说句实在话,这货其实就是为了UWP的Adaptive UI而特意增加 ...

  3. 手把手教你搭建hadoop+hive测试环境(新手向)

    本文由  网易云发布. 作者:唐雕龙 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 面向新手的hadoop+hive学习环境搭建,加对我走过的坑总结,避免大家踩坑. 对于hive相关docke ...

  4. pageadmin CMS 如何添加自定义页面

    理论上网站上的所有页面都可以通过栏目管理来添加,那自定义页面的意义是什么呢? 网站的需求是很多样化的,比如需要制作一个对外提供数据的api,甚至制作一个搜索页面,或者制作一些数据和栏目没有对应关系的页 ...

  5. mysql 行转列 (结果集以坐标显示)

    create table capacity( type int , numbers int , monthst INT ); select type, sum(case monthst when 1 ...

  6. 467. Unique Substrings in Wraparound String

    Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...

  7. linux将指令加入开机启动或加入环境变量

    以mongodb运行指令为例,/usr/local/webserver/mongodb/bin/mongo 1,linux将指令加入环境变量PATH 简单说PATH就是一组路径的字符串变量,当你输入的 ...

  8. 手把手教渗透测试人员打造.NET可执行文件

    在进行渗透测试的过程中,我们有时候会希望使用可执行文件来完成某些任务.最近,我们在测试过程中拿下了一个网站,从而获得了一次发动水坑攻击的机会. 原文地址:https://www.peew.pw/blo ...

  9. 爬虫实战2:爬头条网美图--Ajax图片加载处理

    完整代码经测试可成功运行,目的是抓取头条网输入街拍后的图片,涉及的知识点如下 1. md5加密使用方法 方法1:不创建实例对象,直接使用 >>> from hashlib impor ...

  10. 酱油 Noip2018颓废记

    也不知道写一些什么了 凑和着写写吧 最近十分的¥#&(^ --#%!*%¥^#$# Day -1 上午考了一场试 就\(TM\)考了60分 好不容易积攒起来的信心啊~~~~~~ 就这么垮了~~ ...