5.3.2 超平面的收敛评估

# -*- coding: utf-8 -*-
"""
Created on Mon Dec 4 18:31:14 2017
#qr 5.2.2 linear perceptron

@author: 96379
"""
#导入需要的包
# -*- coding : utf - 8 -*-
import numpy as np
#from common_libs import * # 使用散点图绘制函数
import matplotlib.pyplot as plt


#数据文件转矩阵
#path 数据文件路径
#返回转换后的矩阵形式
def file2matrix(path):
floatRows = []
fp = open(path, "r")#qr 以只读形式打开文件
data_raw = fp.readlines() #qr 按行读取文件 形成一个一维的列表
for row in data_raw:
rowlist = row.strip('\n').split()#qr (strip())对每行去除换行符 (split())按空格切分字符 列表中的元素以逗号分隔
#print(rowlist)
floatRow = [float(i) for i in rowlist]#qr 将字符型数据转换为float型
floatRows.append(floatRow) #qr append() 函数并没有返回值
#print(np.mat(floatRows))
#data = [ [int(j) for j in i] for i in data_strlst]
return np.mat(floatRows)


#qr 利用数据集构造一个矩阵
def buildMat(dataSet):
m, n = np.shape(dataSet)
dataMat = np.zeros((m, n)) # 样本以行的形式展开 m * n ,m个样本 n个特征
dataMat[:, 0] = 1 #矩阵的第一列全部设置为 1 #qr 即为每个样本数据的 w0 系数
dataMat[:, 1:] = dataSet[:, :-1] #第一列和倒数第二列保持数据源不变,删除最后一列
return dataMat #qr 根据训练样本数据集 构造线性分类器的系数矩阵


#1.导入数据
Input = file2matrix("testSet.txt") # 参见第一章
target = Input[ : , -1] #获取分类标签列表
[m , n] = np.shape(Input)


#3构建 x + b 系数矩阵 : b 默认为 1
dataMat = buildMat(Input)
#print(dataMat)

#4定义步长和迭代次数
alpha = 0.001 #步长
steps = 500 #迭代次数
weights = np.ones((n , 1)) #初始化权重向量

def logistic(wTx):
return 1.0 / (1.0 + np.exp(-wTx))

weightlist = []

#执行算法 训练分类器权重 主程序:迭代过程
for k in range(steps):
gradient = dataMat * np.mat(weights) #计算梯度 -> XW
output = logistic(gradient) #logistic函数
errors = target - output # 计算误差
weights = weights + alpha * dataMat.T * errors #修正误差进行迭代
weightlist.append(weights)
print(weights)

plt.figure(1) #qr 产生一张图形
#qr 记录截距变化的趋势
axes1 = plt.subplot(221) #qr 2行 2列 中的第一张
axes2 = plt.subplot(222) #qr 2行 2列 中的第二张
#qr 记录斜率变化的趋势
axes3 = plt.subplot(223)
axes4 = plt.subplot(224)

#权重向量的收敛评估
plt.figure(2)
axes5 = plt.subplot(311)
axes6 = plt.subplot(312)
axes7 = plt.subplot(313)


weightmat = np.mat(np.zeros((steps,n)))
i = 0
for weight in weightlist:
weightmat[i,:] = weight.T
i += 1
X = np.linspace(0, steps, steps)

#qr WX = 0 -> y = wx + b
fig1 = plt.figure(1)
axes1.plot(X[0:10], -weightmat[0:10, 0] / weightmat[0:10,2], color = 'red',linewidth = 1, linestyle ="-")
axes2.plot(X[10:], -weightmat[10:,0] / weightmat[10:,2], color = 'blue',linewidth = 1 , linestyle = "-")

axes3.plot(X[0:10], -weightmat[0:10, 1] / weightmat[0:10,2], color = 'red',linewidth = 1, linestyle = "-")
axes4.plot(X[10:], -weightmat[10:, 1] / weightmat[10:, 2],color = 'blue',linewidth = 1, linestyle = "-")

# qr 绘制第二幅图像
fig2 = plt.figure(2)
axes5.plot(X, weightmat[:, 0],color = 'red',linestyle = '-',linewidth = 1)
axes5.set_ylabel('weight[0]') #qr 设置纵轴标签
axes6.plot(X, weightmat[:, 1], color = 'red', linestyle = '-',linewidth = 1)
axes6.set_ylabel('weight[1]')
axes7.plot(X, weightmat[:, 2], color = 'red', linestyle = '-',linewidth = 1)
axes7.set_ylabel('weight[2]')

plt.show() #显示图形的四个子图绘制结果

 

posted @ 2017-12-09 20:48  蜉蝣2015  阅读(61)  评论(0)    收藏  举报