5.3.1 超平面的变化趋势

# -*- 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)

#按照标签绘制散点图
def drawScatterbyLabel(plt, Input):
(m, n) = np.shape(Input) #qr 获取训练集的尺寸
target = Input[: , -1] #qr 提取训练集的标签列
for i in range(m):
if target[i] == 0: #qr 绘制标签为 0 的散点图
plt.scatter(Input[i, 0], Input[i, 1],c = 'blue',marker = 'o')
else: #qr 绘制其他类别的散点图
plt.scatter(Input[i, 0], Input[i, 1],c = 'red',marker = 's')
#plt.show()

#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)

#2按分类绘制散点图
drawScatterbyLabel(plt, 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)

#绘制分类超平面
X = np.linspace(-5 , 5 ,100)
Ylist = []
lenw = len(weightlist)
for indx in range(lenw):
if indx % 40 == 0: #每隔100条输出一次分类超平面
weights = weightlist[indx]
Y = -(float(weights[0]) + X*(float(weights[1]))) / float(weights[2])
plt.plot(X, Y)
plt.annotate("hplane:" + str(indx), xy = (X[99],Y[99])) #分类超平面的注释
plt.show()

#对测试集进行分类
#分类函数
def classifier(testData, weights):
prob = logistic(sum(testData*weights)) #求取概率---判别算法
if prob > 0.5:
return 1.0 #prob > 0.5 返回 1.0
else:
return 0.0 #prob <= 0.5 返回 0

 

 

posted @ 2017-12-09 15:02  蜉蝣2015  阅读(40)  评论(0)    收藏  举报