《统计学习方法》感知机学习算法原始形式和对偶形式的python实现

原创 2018年04月16日 17:30:38
import os
import csv
import numpy as np
import string
import pandas as pd
import operator
import re as re
import time
import datetime


def perception_train(train_root, threshold = 0.9, lr = 1):
	train = pd.read_csv(train_root, header = None)
	train_label = np.mat(train)[:,1] #训练数据的label,列向量
	for i in range(np.shape(train_label)[0]):
		if train_label[i] == 0:
			train_label[i] = -1
	train_mat = np.mat(train)[:,2:]
	Gram = np.matmul(train_mat, np.transpose(train_mat)) #Gram matrix, 感知机学习算法的对偶形式
	sample_amount = np.shape(train_label)[0]
	weights = np.mat(np.zeros(np.shape(train_mat)[1])) #原始形式的权重,行向量
	alpha = np.mat(np.zeros(np.shape(train_mat)[0])) #对偶形式的权重体现,行向量
	bias = np.float64(0)

	print sample_amount

	precision = 0
	epoch = 1
	while precision < threshold:
		now = datetime.datetime.now()
		print("epoch " + str(epoch) + "launch: " + now.strftime('%Y-%m-%d_%H_%M_%S'))
		positive_amount = 0
		for i in range(sample_amount):
			# predict_label = np.matmul(train_mat[i], np.transpose(weights)) + bias#感知机学习算法原始形式
			predict_label =  np.matmul(alpha, np.transpose(np.multiply(Gram[i], np.transpose(train_label) ) ) )[0,0] + bias #关键步骤,将内积矩阵与yi点乘,再与alpha求内积,就得到当前感知机的输出,这是感知机学习算法的对偶形式,具体公式参考《统计学习方法》P34,其实就是舍弃了weight的存储,以alpha向量存储感知机被第i个样本优化了多少次,并以此来代替weight的存储,因为简单的感知机学习率不变,第i个样本每次预测错误时模型更新的数值都是一样的,为lr*xi*yi,
			if(predict_label*train_label[i,0] > 0):
				positive_amount += 1
				continue
			# weights += lr * train_mat[i] * train_label[i, 0]#原始形式权重更新
			# bias +=	lr * train_label[i, 0]
			alpha[0, i] += lr#对偶形式权重更新
			bias += lr*train_label[i,0]
		precision = np.float64(positive_amount) / sample_amount
		print("epoch " + str(epoch) + "finished, precision: " + str(precision))	
		epoch += 1
	#对偶形式与原始形式得到的结果是一样的
	#np.multiply()为矩阵点乘,前提是两个矩阵形状一致,若不一致而且可以执行矩阵乘法时,这个函数就会执行矩阵乘法
	#对于np.mat,即使只是一个向量,也要当成矩阵来看,取其中的值时需要表面两个维度的坐标

统计学习方法(2)——感知机原始形式、对偶形式及Python实现

感知机作为一种最简单的线性二分类模型,可以在输入空间(特征空间)将实例划分为正负两类。本文主要介绍感知机两种形式对应的学习算法及Python实现。 感知机学习算法的原始形式对于输入空间,感知机通过以下...
  • winter_evening
  • winter_evening
  • 2017-04-16 16:07:23
  • 2973

【统计学习方法】感知机Python 对偶形式实现

上个博客提到了感知机的原始形式,接下来要给大家介绍的是感知机的对偶形式。在对偶形式中,感知机的模型是\[f = sign\left( {\sum\limits_{j = 1}^N {{\alpha _...
  • tudaodiaozhale
  • tudaodiaozhale
  • 2017-08-15 19:54:36
  • 352

感知机模型(原始形式和对偶形式)

本篇博客主要介绍机器学习中十分基础的感知机模型。感知机模型是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别。我们写出基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知...
  • Jaster_wisdom
  • Jaster_wisdom
  • 2017-10-15 15:13:43
  • 861

《李航:统计学习方法》笔记之感知机

感知机学习旨在求出将训练数据集进行线性划分的分类超平面,为此,导入了基于误分类的损失函数,然后利用梯度下降法对损失函数进行极小化,从而求出感知机模型。感知机模型是神经网络和支持向量机的基础。下面分别从...
  • longzaitianya1989
  • longzaitianya1989
  • 2014-09-24 10:33:37
  • 6701

感知机及其对偶问题,参考《统计学习方法》

感知机模型: 1 判别模型, 2 旨在学习出一个线性划分的超平面输入 T= {(x1,y1),(x2,y2)……(xN,yN)}xi 是一n维的特征向量,yi属于{+1,-1}。 通俗来讲就是。...
  • u014422406
  • u014422406
  • 2017-03-06 13:26:07
  • 619

感知机(perceptron)学习算法的对偶形式

算法:\qquad 输入:训练数据集T={(x1,y1),(x2,y2),…,(xN,yN)}T=\{(x_1,y_1),(x_2,y_2),\ldots,(x_N,y_N)\}, 其中xi∈Rnx...
  • FeynmanWang
  • FeynmanWang
  • 2015-07-24 11:40:13
  • 930

感知机学习算法的原始形式的java简单实现

最近开始看《统计学习方法》,下面的代码实现了书中讲的感知机学习算法的一个例子: public class Main { /**  * @param args  * 感知机学习算法原始形式的...
  • ljiantong
  • ljiantong
  • 2014-06-15 16:02:26
  • 885

感知机学习算法的对偶形式

% 感知机学习算法的对偶形式,算法2.2参考李航《统计学习方法》书中第二章的算法 % clear all; clc X=[3,3;4,3;1,1];Y=[1,1,-1];%训练数据集及标记...
  • sruixue
  • sruixue
  • 2014-10-31 19:16:28
  • 2027

感知机学习算法对偶形式(Matlab代码)

1.函数CreateData  CreateData.m %加载数据集function [ dataset ] = CreateData() dataset = load('mywine.txt'...
  • q1007729991
  • q1007729991
  • 2014-12-11 09:13:03
  • 1695

统计学习方法第二章例题2.2代码实践,感知机的对偶形式的代码实现

针对统计学习方法第二章的第二个例题设计了代码如下: (注释部分为自己出错的部分调试代码,小白码代码略扎心) #-*- coding:utf-8 -*- import sys from nump...
  • GrinAndBearIt
  • GrinAndBearIt
  • 2018-01-10 22:58:20
  • 93
收藏助手
不良信息举报
您举报文章:《统计学习方法》感知机学习算法原始形式和对偶形式的python实现
举报原因:
原因补充:

(最多只允许输入30个字)