一般在报错行处,查看是否有拼写错误,或者括号错误 或者报错行用到的数据定义是否有错误
例子
"""
@author: liujie
@software: PyCharm
@file: natives.py
@time: 2020/10/21 17:18
"""
import time
import numpy
as np
from tqdm
import tqdm
def loaddata(filename
):
"""
加载数据集
:param filename: 文件路径
:return: 数据与标签
"""
dataArr
= []
labelArr
= []
fr
= open(filename
)
for line
in tqdm
(fr
.readlines
()):
curLine
= line
.strip
().split
(',')
dataArr
.append
(int(int(num
) > 128) for num
in curLine
[1:])
labelArr
.append
(int(curLine
[0]))
return dataArr
, labelArr
def NaivesBayes(Py
, Px_y
, x
):
"""
通过贝叶斯进行概率估计
:param Py: 先验概率分布
:param Px_y: 条件概率分布
:param x: 要估计的样本
:return: 返回所有label的估计概率
"""
featureNum
= 784
classNum
= 10
P
= [0] * classNum
for i
in range(classNum
):
sum = 0
for j
in range(featureNum
):
sum += Px_y
[i
][j
][x
[j
]]
P
[i
] = sum + Py
[i
]
return P
.index
(max(P
))
def model_test(Py
, Px_y
, testDataArr
, testLabelArr
):
"""
对数据集进行测试
:param Py: 先验概率
:param Px_y: 条件概率
:param testDataArr:测试数据集
:param testLabelArr: 测试数据标签
:return: 返回正确率
"""
errorCnt
= 0
for i
in tqdm
(range(len(testDataArr
))):
predict
= NaivesBayes
(Py
, Px_y
, testDataArr
[i
])
if predict
!= testLabelArr
[i
]:
errorCnt
+= 1
return 1 - (errorCnt
/ len(testDataArr
))
def getAllProbability(trainDataArr
, trainLabelArr
):
"""
通过训练集获得先验概率与条件概率
:param trainDataArr: 训练数据集
:param trainLabelArr: 训练数据集标签
:return: 返回先验概率与条件概率
"""
featureNum
= 784
labelNum
= 10
Py
= np
.zeros
((labelNum
, 1))
for i
in range(labelNum
):
Py
[i
] = (np
.sum(np
.mat
(trainLabelArr
) == True) + 1) / (len(trainLabelArr
) + 10)
Py
= np
.log
(Py
)
Px_y
= np
.zeros
((labelNum
, featureNum
, 2))
for i
in range(len(trainLabelArr
)):
label
= trainLabelArr
[i
]
x
= trainDataArr
[i
]
for j
in range(featureNum
):
Px_y
[label
][j
][int(x
[j
])] += 1
for label
in range(labelNum
):
for j
in range(featureNum
):
Px_y0
= Px_y
[label
][j
][0]
Px_y1
= Px_y
[label
][j
][1]
Px_y
[label
][j
][0] = np
.log
((Px_y0
+ 1) / (Px_y0
+ Px_y1
+ 2))
Px_y
[label
][j
][1] = np
.log
((Px_y1
+ 1) / (Px_y0
+ Px_y1
+ 2))
return Py
, Px_y
if __name__
== '__main__':
start
= time
.time
()
print('start to read trainSet')
trainDataArr
, trainLabelArr
= loaddata
('data/mnist_train.csv')
print('start to read testSet')
testDataArr
, testLabelArr
= loaddata
('data/mnist_test.csv')
print('start to train')
Py
, Px_y
= getAllProbability
(trainDataArr
, trainLabelArr
)
print('start to test')
accuracy
= model_test
(Py
, Px_y
, testDataArr
, testLabelArr
)
print('accuracy = ', accuracy
)
end
= time
.time
()
print('time=', end
- start
)
错误为
Traceback
(most recent call last
):
File
"D:\softwares\anaconda3\envs\your_env_name\lib\site-packages\IPython\core\interactiveshell.py", line
3343, in run_code
exec(code_obj
, self
.user_global_ns
, self
.user_ns
)
File
"<ipython-input-2-4dc2ff38dd49>", line
1, in <module
>
runfile
('D:/PycharmProjects/MyTest/李航统计学习方法/natives.py', wdir
='D:/PycharmProjects/MyTest/李航统计学习方法')
File
"D:\softwares\PyCharm\plugins\python\helpers\pydev\_pydev_bundle\pydev_umd.py", line
197, in runfile
pydev_imports
.execfile(filename
, global_vars
, local_vars
)
File
"D:\softwares\PyCharm\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line
18, in execfile
exec(compile(contents
+"\n", file, 'exec'), glob
, loc
)
File
"D:/PycharmProjects/MyTest/李航统计学习方法/natives.py", line
236, in <module
>
Py
, Px_y
= getAllProbability
(trainDataArr
, trainLabelArr
)
File
"D:/PycharmProjects/MyTest/李航统计学习方法/natives.py", line
148, in getAllProbability
Px_y
[label
][j
][x
[j
]] += 1
TypeError
: 'generator' object is not subscriptable
首先,报错行处括号与拼写皆没有错误 然后查看label与x的定义是否有错误, 发现
发现该行列表推导式少了括号
dataArr
.append
([int(int(num
) > 128) for num
in curLine
[1:]])
添加括号后,错误解决
转载请注明原文地址: https://lol.8miu.com/read-25361.html