5.1.7 逐次逼近法

# -*- 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 根据训练样本数据集 构造线性分类器的系数矩阵


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

#按分类绘制散点图
drawScatterbyLabel(plt, Input)

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

#print(dataMat)

#定义步长和迭代次数
alpha = 0.001 #步长
steps = 500 #迭代次数

weights = np.ones((n , 1)) #初始化权重向量
'''
'''
#激活函数 硬限幅函数
def hardlim(dataSet):
dataSet[nonzero(dataSet.A > 0)[0]] = 1
dataSet[nonzero(dataSet.A <= 0)[0]] = 0
return dataSet
'''
'''
def logistic(wTx):
return 1.0 / (1.0 + np.exp(-wTx))

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

#绘制分类超平面
X = np.linspace(-5 , 5 ,100)
Y = -(float(weights[0]) + X*(float(weights[1]))) / float(weights[2])
plt.plot(X, Y)
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

#对测试数据进行分类
testData = np.mat([-0.147324 , 2.874846]) #测试数据
(m , n) = np.shape(testData) #构建测试数据矩阵
testmat = np.zeros((m, n + 1))
testmat[: , 0] = 1 #qr 将测试集 w0 的系数 设定为 1 
testmat[:, 1:] = testData
print (classifier(testmat, weights)) #执行分类

 

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