9.16搜狗笔试-朴素贝叶斯

笔试的时候用numpy报错了,贼心不死,用python重写了一遍,还望各位大佬多多指正。
尝试将连续值离散化效果并不好,后来用正态分布算得概率分布,过题目给的测试用例好像是ok的。
本着学习的态度,和大家交流一下,攒一波人品,Q offer!!!
import sys
import math
# load data
def loadDataSet():
    line1 = sys.stdin.readline().strip().split()
    first_line = [int(item) for item in line1]
    train_data = []
    train_label = []
    for i in range(first_line[0]):
        line = sys.stdin.readline().strip().split()
        sample = [int(item) for item in line]
        label = sample.pop(0)
        train_label.append(label)
        train_data.append(sample)
    test_data = []
    for j in range(first_line[1]):
        line = sys.stdin.readline().strip().split()
        line.pop(0)
        sample = [int(item) for item in line]
        test_data.append(sample)
    return train_data, train_label, test_data

# 获得均值和方差
def getMeanAndVariance(matrix):
    numOfSamples = len(matrix)
    numOfFeatures = len(matrix[0])
    mean = [0 for _ in range(numOfFeatures)]
    for i in range(numOfSamples):
        for j in range(numOfFeatures):
            mean[j] += matrix[i][j]
    mean = list(map(lambda x: x/numOfSamples, mean)) # 求得均值
    variance = [0 for _ in range(numOfFeatures)]
    for i in range(numOfSamples):
        for j in range(numOfFeatures):
            variance[j] += (matrix[i][j] - mean[j]) ** 2
    variance = list(map(lambda x: x / numOfSamples, variance))  # 求得方差
    return [(m,v) for m,v in zip(mean,variance)]

def trainNB(trainMatrix, trainLabels):
    numOfTrainSamples = len(trainMatrix)
    pAbusive = sum(trainLabels) / float(numOfTrainSamples) # 得到正样本的概率
    samples0 = []
    samples1 = []
    for i in range(numOfTrainSamples):
        if trainLabels[i] == 1:
            samples1.append(trainMatrix[i])
        else:
            samples0.append(trainMatrix[i])
    mv0 = getMeanAndVariance(samples0)
    mv1 = getMeanAndVariance(samples1)

    return mv0, mv1, pAbusive
# 得到高斯分布概率
def gaussianDistribution(m, v, x):
    zhishu = (x - m)**2/(2*v)
    xishu = 1/(math.sqrt(2*math.pi*v))
    res = xishu*math.exp(-zhishu)
    return res

def classifyNB(sample,mv0,mv1,pClass1): #比较概率大小进行判断
    p1 = 1
    p0 = 1
    for (m,v),x in zip(mv1,sample):
        gd = gaussianDistribution(m, v, x) # 获得正太分布概率
        p1 *= gd
    p1 *= pClass1
    for (m,v),x in zip(mv0,sample):
        gd = gaussianDistribution(m, v, x) # 获得正太分布概率
        p0 *= gd
    p0 *= (1-pClass1)
    if p1>p0:
        return 1
    else:
        return 0

def testNB():
    train_data, train_label, test_data = loadDataSet()
    mv0,mv1,pAb = trainNB(train_data,train_label)
    for test_sample in test_data:
        print(classifyNB(test_sample,mv0,mv1,pAb))

'''
4   2   3
1   13  0   10
0   6   11  2
1   17  2   14
0   8   16  13
?   20  3   19
?   2   13  18
'''
if __name__ == '__main__':
    testNB()





#笔试题目##搜狗##题解#
全部评论
你这样不算朴素贝叶斯吧
点赞 回复 分享
发布于 2019-09-18 20:12
不对,我找找规律60%……
点赞 回复 分享
发布于 2019-09-17 09:06
昨天也是这么写的,按着西瓜书写了代码,但是用例都不过,给的那个用例是对的
点赞 回复 分享
发布于 2019-09-17 09:01
mbdl。
点赞 回复 分享
发布于 2019-09-17 01:41

相关推荐

码农索隆:这种hr,建议全中国推广
点赞 评论 收藏
分享
点赞 评论 收藏
分享
06-12 10:50
门头沟学院 Java
你的不定积分没加C:我怎么在学院群看到了同样的话
点赞 评论 收藏
分享
05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
投递美团等公司9个岗位
点赞 评论 收藏
分享
评论
点赞
12
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务