Logistic回归代码蜜汁bug(机器学习实战)

心谭 2017-07-19 03:48:46
先说一下报错,很奇怪。


#报错信息
Traceback (most recent call last):
File "c:\Users\Asura-Dong\Desktop\Blog\learn\MachineLearning\Unit5\Logistic.py", line 99, in <module>
weights1 = stocGradAscent1(dataArr,labelMat)
File "c:\Users\Asura-Dong\Desktop\Blog\learn\MachineLearning\Unit5\Logistic.py", line 78, in stocGradAscent1
weights = weights+alpha*error*dataMatrix[randIndex]
TypeError: 'numpy.float64' object cannot be interpreted as an integer


为什么会出现这种报错???哪里需要float->integer???
代码如下(错误在78行)


from numpy import *
from matplotlib import pyplot as plt

def loadDataSet():
dataMat = []
labelMat = []
fr = open('testSet.txt')
for line in fr.readlines():
lineArr = line.strip().split()
dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
labelMat.append(int(lineArr[2]))
return dataMat,labelMat

#定义Sigmoid函数
def sigmoid(inX):
return 1.0/(1+exp(-inX))

def gradAscent(dataMatIn,classLabels):
dataMatrix = mat(dataMatIn)
labelMat = mat(classLabels).transpose()
m,n = shape(dataMatrix) #m个样本,n维/个
alpha = 0.001#移动的步长
maxCycles = 500 #迭代次数
weights = ones((n,1))
for k in range(maxCycles):
h = sigmoid(dataMatrix*weights)
error = (labelMat-h)
weights = weights + alpha*dataMatrix.T*error
return weights


def plotBestFit(weights):
dataMat,labelMat = loadDataSet()
dataArr = array(dataMat)
n = shape(dataArr)[0]
xcord1 = []
ycord1 = []
xcord2 = []
ycord2 = []

for i in range(n):
if int(labelMat[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]
ax.plot(x,y)
plt.show()

def stocGradAscent0(dataMatrix,classLabels):
m,n = shape(dataMatrix)
alpha = 0.01
weights = ones(n)
for i in range(m):
h = sigmoid(dataMatrix[i]*weights)
error = classLabels[i]-h
#error和h是数值
weights = weights + alpha*error*dataMatrix[i]
return weights

def stocGradAscent1(dataMatrix,classLabels,numIter = 150):
m,n = shape(dataMatrix)
weights = array([1.0,1.0,1.0])
for j in range(numIter):
dataIndex = range(m)
for i in range(m):
alpha = 4//(1.0+j+i)+0.01 #注意常数项.保证alpha不断变小,但不为0
randIndex = int(random.uniform(0,len(dataIndex)))#改动2:随机选取
h = sigmoid(sum(dataMatrix[randIndex]*weights))
error = classLabels[randIndex]-h
weights = weights+alpha*error*dataMatrix[randIndex]
del(dataIndex[randIndex])
return weights


if __name__=='__main__':
dataArr , labelMat = loadDataSet()
'''
print("dataArr is:")
for line in dataArr:
print(line)

print("labelMat is:\n",labelMat)
for line in labelMat:
print(line)
weights = stocGradAscent0(dataArr,labelMat)
print(weights)
plotBestFit(weights)
'''
weights1 = stocGradAscent1(dataArr,labelMat)
print(weights)
plotBestFit(weights)

...全文
989 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
_莫等闲_ 2018-03-18
  • 打赏
  • 举报
回复
def stoc_grad_ascent(data_matrix_in, class_labels): '''随机梯度上升算法''' m, n = shape(data_matrix_in) alpha = 0.01 weights = ones(n) for i in range(m): h = sigmoid(sum(data_matrix_in[i] * weights)) error = class_labels[i] - h weights = weights + alpha * error * array(data_matrix_in[i]) return asmatrix(weights).transpose() 倒数第二句,把data_matrix_in[i]转成array 最后一句把array转成matrix再转置;
_莫等闲_ 2018-03-18
  • 打赏
  • 举报
回复
def stoc_grad_ascent(data_matrix_in, class_labels): '''随机梯度上升算法''' m, n = shape(data_matrix_in) alpha = 0.01 weights = ones(n) for i in range(m): h = sigmoid(sum(data_matrix_in[i] * weights)) error = class_labels[i] - h weights = weights + alpha * error * array(data_matrix_in[i]) return asmatrix(weights).transpose() 最后一句把array转成matrix再转置。
ash_time 2017-10-10
  • 打赏
  • 举报
回复
哈哈 我今天也碰到了,机器学习实战上的吧! 楼上说的对, weights1 = stocGradAscent1(dataArr,labelMat) 这里改成 weights1 = stocGradAscent1(array(dataArr),labelMat)
叶上 2017-08-03
  • 打赏
  • 举报
回复
可以改成这样: def stocGradAscent0(dataMatrix,classLabels): #随机梯度上升算法 dataMatrix = mat(dataMatrix) m,n = shape(dataMatrix) alpha = 0.01 weights = ones((1,3)) for i in range(m): a=dataMatrix[i].copy() a=a.transpose() h = sigmoid(dot(weights,a)) error =classLabels[i] -h weights = weights +alpha * error * dataMatrix[i] return weights.transpose()
secsilm 2017-07-20
  • 打赏
  • 举报
回复
我调试了一下你的代码,(我猜)错误出现在alpha*error*dataMatrix[i]这里,error是一个 float64,而dataMatrix[i]是一个列表,你用float64去乘一个列表是会报错的,建议将dataMatrix转换成numpy array再进行运算,尽量不要 array和list混合运算,因为一个常数去乘一个array和list的差别还是很大的。 另外,你的numpy的版本应该是1.12吧?
心谭 2017-07-19
  • 打赏
  • 举报
回复
不是有 from numpy import * 了吗。。 什么是weights类型和int类型相加?麻烦注意看一下好吗。 那是array类型。 @sanGuo_uu
心谭 2017-07-19
  • 打赏
  • 举报
回复
@u012536120 二楼,???你在说什么???
sanGuo_uu 2017-07-19
  • 打赏
  • 举报
回复
weights = array([1.0,1.0,1.0]) 我没有array关键词。——name array is not defined 还有 weights = weights+alpha*error*dataMatrix[randIndex] weights类型可以和Int类型加?
心谭 2017-07-19
  • 打赏
  • 举报
回复
自己来顶一下。 下到的源码也走不通(同样是这里出错)。 说一下环境: python 3.5 win10平台。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧