注意:
1.真实案例有缺失数据,文档中数据已对数据预处理:
①对数据属性进行预处理:
对缺失数据进行置0
②对数据标签预处理:
对缺失标记的数据删除
2.此案例未涉及使用图像展示回归线
3.难点:
①对随机梯度下降的理解(随机梯度下降法会使训练次数增加,但梯度下降快)
②current[-1]代表数组中倒数第一个数字
4.完整代码
import numpy as np
import random
"sigmoid函数"
def sigmoid(inX):
return 1.0/(1+np.exp(-inX))
"随机梯度下降法"
def stocGrandAscent1(dataMatrix,classLable,numItrt=150):
'加载数据属性-标签-随机下降法循环次数'
m,n=np.shape(dataMatrix)
# 设置初始权重
w=np.ones(n)
for i in range(numItrt):
# 随机获得数组下标
dataIndex=list(range(m)) 'dataIndex = [0,1,2,3,4...,m]'
for k in range(m):
'变更学习率-随机下标-更新w-删除选到的下标'
alpha=4/(1.0+i+k)+0.01
# randIndex=int(range(m))
randIndex = int(random.uniform(0, len(dataIndex)))
w=w+alpha*(classLable[dataIndex[randIndex]]-sigmoid((dataMatrix[dataIndex[randIndex]]*w)))*dataMatrix[dataIndex[randIndex]]
del (dataIndex[randIndex])
return w
"预测分类"
def classifyVector(inX,w):
p=sigmoid(sum(inX*w))
if p>0.5:
return 1.0
else:
return 0.0
"测试:训练集样本数据分类"
def horseTest():
# 加载数据-训练数据(随机梯度下降法)-测试数据(计算预测分类函数)-输出错误率
frTrain=open("horseColicTraining.txt")
frTests=open("horseColicTest.txt")
trainSet=[]
trainLables=[]
for line in frTrain.readlines():
current=line.strip().split('\t')
lineArr=[]
# 每行的第1-len()-1个是属性将其加入当前行数组后添加置trainSet,最后一个是标签(current[-1]位置)
for i in range(len(current)-1):
lineArr.append(float(current[i]))
trainSet.append(lineArr)
trainLables.append(float(current[-1]))
trainW=stocGrandAscent1(np.array(trainSet),trainLables,5000)
errNum=0
countNum=0.0
for line in frTests.readlines():
countNum+=1.0
current = line.strip().split('\t')
lineArr = []
# 每行的第1-len()-1个是属性将其加入当前行数组后添加置trainSet,最后一个是标签(current[-1]位置)
for i in range(len(current) - 1):
lineArr.append(float(current[i]))
if int(classifyVector(np.array(lineArr), trainW)) != int(current[-1]):
errNum += 1
errRate=(float(errNum)/countNum)*100
print("错误率为:%.2f%%"%errRate)
if __name__ == '__main__':
horseTest()
版权声明:本文为weixin_41831593原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。