机器学习入门:数字识别(逻辑回归)

logistic回归一般用于二分类问题,比如判断一封邮件是否为垃圾邮件,判断照片中的人是男是女,也可以用于多分类问题,比如k类别,就进行k次logistic回归,下面是实现的一个实例。

思想也和简单,做十次逻辑回归,第一次将0作为一类,其他数字为另外一类,如此类推

1.读取内容并返回m*1024形式的样本以及对应的数字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def loadData(direction):
trainfileList=listdir(direction)
m=len(trainfileList)
dataArray= zeros((m,1024))
labelArray= zeros((m,1))
for i in range(m):
returnArray=zeros((1,1024)) #每个txt文件形成的特征向量
filename=trainfileList[i]
fr=open('%s/%s' %(direction,filename))
for j in range(32):#32*32转化成1*1024的形式
lineStr=fr.readline()
for k in range(32):
returnArray[0,32*j+k]=int(lineStr[k])
dataArray[i,:]=returnArray #存储特征向量

filename0=filename.split('.')[0]
label=filename0.split('_')[0]
labelArray[i]=int(label) #存储类别
return dataArray,labelArray
  • sigmoid(inX)函数
1
2
def sigmoid(inX):
return 1.0/(1+exp(-inX))

然后用梯度下降算法得到回归系数:

alpha是步长,maxCycles是迭代步数。

1
2
3
4
5
6
7
8
9
10
def gradAscent(dataArray,labelArray,alpha,maxCycles):
dataMat=mat(dataArray) #size:m*n
labelMat=mat(labelArray) #size:m*1,表示结果
m,n=shape(dataMat)#获取矩阵大小
weigh=ones((n,1)) #权重初始化,多次迭代后得到结果
for i in range(maxCycles):
h=sigmoid(dataMat*weigh)
error=labelMat-h #size:m*1
weigh=weigh+alpha*dataMat.transpose()*error
return weigh

然后我们就得到了权重

最后我们进行分类,我们这里直接用sigmoid函数进行分类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def classfy(testdir,weigh):
dataArray,labelArray=loadData(testdir)
dataMat=mat(dataArray)
labelMat=mat(labelArray)
h=sigmoid(dataMat*weigh) #size:m*1
m=len(h)
error=0.0
for i in range(m):
if int(h[i])>0.5:
print int(labelMat[i]),'is classfied as: 1'
if int(labelMat[i])!=1:
error+=1
print 'error'
else:
print int(labelMat[i]),'is classfied as: 0'
if int(labelMat[i])!=0:
error+=1
print 'error'
print 'error rate is:','%.4f' %(error/m)

然后我们把这些函数整合起来

1
2
3
4
def digitRecognition(trainDir,testDir,alpha=0.07,maxCycles=10):
data,label=loadData(trainDir)
weigh=gradAscent(data,label,alpha,maxCycles)
classfy(testDir,weigh)

总结

可以看出我只对01进行了分类,而且做法太直接了,算是最基础的题目了,数据分析、特征工程直接忽略了,原因很简单,菜,而且时间也有限,不过这种类型的用逻辑回归处理不太好,所以有时间我会学习并复制另外一种解法。

-------------本文结束有空来玩-------------
坚持原创技术分享,您的支持将鼓励我继续创作!