修改图片和logistic回归的md文件

This commit is contained in:
chenyyx
2017-07-03 21:26:33 +08:00
parent 295c71b125
commit ce511ef9b5
18 changed files with 703 additions and 92 deletions

View File

@@ -5,7 +5,7 @@
Created on Oct 27, 2010
Update on 2017-05-18
Logistic Regression Working Module
@author: Peter Harrington/羊
@author: Peter Harrington/羊三/小瑶
《机器学习实战》更新地址https://github.com/apachecn/MachineLearning
'''
from numpy import *
@@ -19,6 +19,7 @@ def loadDataSet(file_name):
fr = open(file_name)
for line in fr.readlines():
lineArr = line.strip().split()
# 将 X0 的值设为 1.0
dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
labelMat.append(int(lineArr[2]))
return dataMat,labelMat
@@ -29,33 +30,37 @@ def sigmoid(inX):
# 正常的处理方案
# 两个参数:第一个参数==> dataMatIn 是一个2维NumPy数组每列分别代表每个不同的特征每行则代表每个训练样本。
# 第二个参数==> classLabels 是类别标签,它是一个 1*100 的行向量。为了便于矩阵计算需要将该行向量转换为列向量做法是将原向量转置再将它赋值给labelMat。
def gradAscent(dataMatIn, classLabels):
# 转化为矩阵[[1,1,2],[1,1,2]....]
dataMatrix = mat(dataMatIn) #convert to NumPy matrix
dataMatrix = mat(dataMatIn) # 转换为 NumPy 矩阵
# 转化为矩阵[[0,1,0,1,0,1.....]],并转制[[0],[1],[0].....]
# transpose() 行列转函数
# 将行矩阵转化为列矩阵 => 矩阵的转置
labelMat = mat(classLabels).transpose() #convert to NumPy matrix
# m->数据量 n->特征数
# transpose() 行列转函数
# 将行向量转化为列向量 => 矩阵的转置
labelMat = mat(classLabels).transpose() # 首先将数组转换为 NumPy 矩阵,然后再将行向量转置为列向量
# m->数据量,样本数 n->特征数
m,n = shape(dataMatrix)
# print m, n, '__'*10, shape(dataMatrix.transpose()), '__'*100
# 步长
# alpha代表向目标移动的步长
alpha = 0.001
# 迭代次数
maxCycles = 500
# 生成一个长度和特征数相同的矩阵此处n为3 -> [[1],[1],[1]]
# 回归系数
# weights 代表回归系数, 此处的 ones((n,1)) 创建一个长度和特征数相同的矩阵,其中的数全部都是 1
weights = ones((n,1))
for k in range(maxCycles): #heavy on matrix operations
# m*3的矩阵 * 3*1的单位矩阵 m*1的矩阵
# m*3 的矩阵 * 3*1 的单位矩阵 m*1的矩阵
# 那么乘上单位矩阵的意义,就代表:通过公式得到的理论值
# 参考地址: 矩阵乘法的本质是什么? https://www.zhihu.com/question/21351965/answer/31050145
# print 'dataMatrix====', dataMatrix
# print 'weights====', weights
# n*3 * 3*1 = n*1
h = sigmoid(dataMatrix*weights) #matrix mult
h = sigmoid(dataMatrix*weights) # 矩阵乘法
# labelMat是实际值
error = (labelMat - h) #vector subtraction
error = (labelMat - h) # 向量相减
# 0.001* (3*m)*(m*1) 表示在每一个列上的一个误差情况,最后得出 x1,x2,xn的系数的偏移量
weights = weights + alpha * dataMatrix.transpose() * error #matrix mult
weights = weights + alpha * dataMatrix.transpose() * error # 矩阵乘法,最后得到回归系数
return array(weights)
@@ -67,10 +72,12 @@ def stocGradAscent0(dataMatrix, classLabels):
alpha = 0.01
# n*1的矩阵
# 函数ones创建一个全1的数组
weights = ones(n) #initialize to all ones
weights = ones(n) # 初始化长度为n的数组元素全部为 1
for i in range(m):
# sum(dataMatrix[i]*weights)为了求 f(x)的值, f(x)=a1*x1+b2*x2+..+nn*xn
# sum(dataMatrix[i]*weights)为了求 f(x)的值, f(x)=a1*x1+b2*x2+..+nn*xn,此处求出的 h 是一个具体的数值,而不是一个矩阵
h = sigmoid(sum(dataMatrix[i]*weights))
# print 'dataMatrix[i]===', dataMatrix[i]
# 计算真实类别与预测类别之间的差值,然后按照该差值调整回归系数
error = classLabels[i] - h
# 0.01*(1*1)*(1*n)
print weights, "*"*10 , dataMatrix[i], "*"*10 , error
@@ -81,16 +88,17 @@ def stocGradAscent0(dataMatrix, classLabels):
# 随机梯度上升算法(随机化)
def stocGradAscent1(dataMatrix, classLabels, numIter=150):
m,n = shape(dataMatrix)
weights = ones(n) #initialize to all ones
# 随机度, 循环150,观察是否收敛
weights = ones(n) # 创建与列数相同的矩阵的系数矩阵所有的元素都是1
# 随机度, 循环150,观察是否收敛
for j in range(numIter):
# [0, 1, 2 .. m-1]
dataIndex = range(m)
for i in range(m):
# i和j的不断增大导致alpha的值不断减少但是不为0
alpha = 4/(1.0+j+i)+0.0001 #apha decreases with iteration, does not
alpha = 4/(1.0+j+i)+0.0001 # alpha 会随着迭代不断减小但永远不会减小到0因为后边还有一个常数项0.0001
# 随机产生一个 0len()之间的一个值
randIndex = int(random.uniform(0,len(dataIndex)))#go to 0 because of the constant
# random.uniform(x, y) 方法将随机生成下一个实数,它在[x,y]范围内,x是这个范围内的最小值y是这个范围内的最大值。
randIndex = int(random.uniform(0,len(dataIndex)))
# sum(dataMatrix[i]*weights)为了求 f(x)的值, f(x)=a1*x1+b2*x2+..+nn*xn
h = sigmoid(sum(dataMatrix[randIndex]*weights))
error = classLabels[randIndex] - h
@@ -139,8 +147,8 @@ def main():
dataArr = array(dataMat)
# print dataArr
# weights = gradAscent(dataArr, labelMat)
# weights = stocGradAscent0(dataArr, labelMat)
weights = stocGradAscent1(dataArr, labelMat)
weights = stocGradAscent0(dataArr, labelMat)
# weights = stocGradAscent1(dataArr, labelMat)
# print '*'*30, weights
# 数据可视化