forked from wepe/MachineLearning
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlogistic regression.py
More file actions
99 lines (74 loc) · 2.66 KB
/
Copy pathlogistic regression.py
File metadata and controls
99 lines (74 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# -*- coding: utf-8 -*-
"""
Created on Tue Dec 09 21:54:00 2014
@author: wepon
程序说明:
loadData函数
实现的功能是从文件夹中读取所有文件,并将其转化为矩阵返回
如调用loadData('train'),则函数会读取所有的txt文件('0_0.txt'一直到'1_150.txt')
并将每个txt文件里的32*32个数字转化为1*1024的矩阵,最终返回大小是m*1024的矩阵
同时返回每个txt文件对应的数字,0或1
sigmoid函数
实现sigmoid函数的功能
gradAscent函数
用梯度下降法计算得到回归系数
classfy函数
根据回归系数对输入的样本进行预测
"""
#!/usr/bin/python
from numpy import *
from os import listdir
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):
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
def sigmoid(inX):
return 1.0/(1+exp(-inX))
#alpha:步长,maxCycles:迭代次数,可以调整
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
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)
def digitRecognition(trainDir,testDir,alpha=0.07,maxCycles=10):
data,label=loadData(trainDir)
weigh=gradAscent(data,label,alpha,maxCycles)
classfy(testDir,weigh)