社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
本系列文章主要是对李航老师的《统计方法分析》里涉及到的机器学习算法利用python进行实现,每个算法包括两部分,理论说明和代码实现,为方便在调用模块或类的时候查看原理,相关理论说明在代码中以文档字符串出现。第一篇为感知机的原始算法。
#-*- encoding:utf-8 -*-
#-------------------------------------V1.0.0------------------------------------------------
#Implementation of Perceptron Learning Algorithm with Python |
#Author:Julie |
#Date:2018.11.29 |
#-------------------------------------------------------------------------------------------
#Algorithm Description
#该分类器用于对线性二分类数据,模型为y=sign(w*x+b),对应着一个超平面w*X+b=0,w是超平面的法向量,b是超平面的截距。
#1:对数据集D进行适当的处理,从中产生训练集S和测试集T 如何选取参考:机器学习测试集选取常用方法-《机器学习》周志华
#2:指定损失函数,梯度下降,L(w,b)=-∑yi(w*xi+b),(xi,yi)为误分类点
#3:训练:最小化损失函数,梯度下降minL:w = w+r*xi*yi,b=b+r*yi,0<r<=1,表示学习速率
#4:代入测试集进行验证,评价指标主要有
# error rate 错误率:E(M)= 1-A(M),分类错误样本数占样本总数的比例
# 精度(accuracy)= 1-错误率
# 训练误差(training error):学习器在训练集上的误差
# 泛化误差(generalization):在新样本上的误差
# 混淆矩阵,比较分类结果和实例的真实信息
# 真阳True Positive(TP):正类预测为正类;伪阳False Positive(FP):负类预测为正类;
# 真阴True Negative(TN):负类预测为负类;伪阴False Negative(FN):正类预测为负类;
# 真正率(True Positive Rate,TPR):TPR=TP/(TP+FN),即被预测为正的正样本数 /正样本实际数。
# 假正率(False Positive Rate,FPR) :FPR=FP/(FP+TN),即被预测为正的负样本数 /负样本实际数。
# 假负率(False Negative Rate,FNR) :FNR=FN/(TP+FN),即被预测为负的正样本数 /正样本实际数。
# 真负率(True Negative Rate,TNR):TNR=TN/(TN+FP),即被预测为负的负样本数 /负样本实际数
# Accurancy准确率:A(M)=(TN+TP)/(TN+FN+TP+FP),即正确分类的样本数与总样本数之比,当样本不同类别数量差距较大时(skewed class数据集偏斜),该指标不可靠
# Precision精确率,查准率:P(M)= TP/(TP+FP),即样本中的某类被正确分类的样本占所有预测为该类的样本数量之比
# Recall 召回率,查全率:R(M)= TP/(TP+FN),即样本中的某类被正确分类的样本占所有实际为该类的样本数量之比
# F1 score:2/F1 = 1/P+1/R3,精确率和召回率的调和均值
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#create training DataSet
def trainDataSet():
sampels = np.array([[3,3],[4,3],[1,1]])
labels = np.array([1,1,-1])
return sampels,labels
#define classifier
def calculateLabel(X,(w,b)):
y = np.dot(X,w)+b
return y
#train the model,update w,b
def updateP(X,labels,(w,b),r):
Y = calculateLabel(X,(w,b)) #求出预测值
Y2 = Y*labels
errIndex = np.where(Y2<=0)[0] #求出yi(w*xi+b)<=0的索引
if np.size(errIndex)==0:
return (w,b)
else:
x = X[errIndex[0]]
y = labels[errIndex[0]]
w = w+np.dot(x,y)*r
b = b+r*y
return updateP(X,labels,(w,b),r)
trainDataSet = trainDataSet()
X = trainDataSet[0]
labels = trainDataSet[1]
(w,b)=[0,0],0 #设定参数初始值
r = 1 #设定学习率
(w,b) = updateP(X,labels,(w,b),r)#更新参数
print (w,b)
#plot data in figure
x = np.linspace(0,10,40)
y = np.zeros(40)
a = -w[0]/w[1]
b = -b/w[1]
y = np.dot(a,x)+b
fig,axes = plt.subplots(1,1)#创建一个包含一个绘图区域的图像
axes.scatter(X[:,0],X[:,1])#绘制样本散点图
axes.plot(x,y) #绘制超平面,即分类器
plt.title(r'PLA',fontsize=20)#设定图标的显示样式属性等
plt.xlabel('x(1)',fontsize=15)
plt.ylabel('x(2)',fontsize=15)
plt.show() #打印图像
运行结果如下:w =[1,1],b=-3
下一 篇:针对该篇,把该实现过程封装为类。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!