在今天的课程视频中,我一直在听老师讲算法,感觉重在理解,老师讲的内容也比较好理解,没有什么好截图,于是在课下总结时参看算法书进行再次学习。算法书是真的难,我觉得可能这部分知识本身就很难,不过老师讲的是理论知识,而且老师水平高超,使我理解较快,但是实践是真的难。看书时发现部分代码真的难以理解,先记录一下吧。
一.算法概述
1.Sigmoid函数于logistic算法的关系
2.Sigmoid函数的向量表示,以及各个参数的含义
二.训练算法:使用梯度上升找到最佳参数
Logistic 梯度上升优化算法
def loadDataSet():
dataMat = [] ; lableMat = []
fr = open('testSet.txt')
for line in fr.readline();# readline(size) 方法用于从文件读取整行,包括 "\n" 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 "\n" 字符。
lineArr = line.strip().split()
#Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符
#Python split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])
lableMat.append(lineArr[2])
return dataMat,lableMat
def sigmoid (inX)
return 1.0/(1+exp(-inX))
def gradAscent(dataMatIn,classLabels):
dataMatrix = mat(dataMatIn) # 转化成矩阵
labelMat = mat(classLabels).transpose()
m,n = shape(dataMatrix)
alpha = 0.001
maxCycles = 500
weights = ones((n,1))
for k in range (maxCycles)
h =sigmoid(dataMatrix*weights)
error = (labelMat - h)
weights+=alpha*dataMatrix.transpose()*error
return weights
决策边界的画法(自己目前对代码也不咋理解,先机械的敲了一遍)
def plotBestFit(wei)
import matplotlib.pyplot as plt
weights = wei.getA()
dataMat ,lableMat = loadDataSet()
dataArr = array(dataMat)
n = shape(dataArr)[0]
xcord1 = [] ;ycord1 = []
xcord2 = []; ycord2 = []
for i in range(n):
if int(lableMat[i])==1:
xcord1.append(dataArr[i,1]) ; ycord1.append(dataArr[i,2])
else:
xcord2.append(dataArr[i,1]) ; ycord2.append(dataArr[i,2])
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xcord1,ycord1,s=30,c='red',marker='s')
ax.scatter(xcord2,ycord2,s=30,c='green')
x=arange(-3.0,3.0,0.1)
y=(-weights[0]-weights[1]*x)/weights[2];
as.plot(x,y)
plt.xlabel('X1');plt.ylabel('X2');
plt.show()
改进的随即上升梯度算法
def stocGradAscent1(dataMatrix,classLabels,numIter=150)
m,n =shape(dataMatrix)
weights = ones(n)
for j in range (numIter): dataIndex = range(m)
for i in range(m)
alpha = 4/(1.0+j+i)+0.01
randIndex = int(random.uniform(0,len(dataIndex)))
h = sigmoid(sum(dataMatrix[randIndex]*weights))
error = classLabels[randIndex]-h
weights+=alpha*error*dataMatrix[randIndex]
del(dataIndex[randIndex])
return weights