统计学习方法第四章朴素贝叶斯

class NaiveBayes:
    def __init__(self):
        self.model=None
    def mean(X):
        #数学期望
        return sum(X)/float(len(X))
    def stdev(self,X):
        #求标准差
        avg=self.mean(X)
        return math.sqrt(sum([pow(X-avg,2) for x in X])) /float(len(X))
    def gaussian(self,x,mean,stdev):
        #求高斯分布的概率密度函数
        resault=math.exp(-(math.pow(x-mean,2)/(2*math.pow(stdev,2))))
        return=(1/math.sqrt(2*math.pi)*math.pow(stdev,2))*resault
    def summarize(self,train_data):
        summarizes=[(self.mean(i),self.stdev(i)) for i in zip(*train_data)]
        #zip:压缩;zip(*train_data):解压缩。将train_data看作是压缩之后的元组列表进行解压
        #eg:若train_data= np.array([[-1, -1], [-2, -1], [-3, -2]])
        #则zip(*train_data)将每个数组的对应位置的元素取出结果为:(-1,-2,-3){一类y的结果对应的每个数组的第0个元素};
        #(-1,-2,1,2){每个数组的第1个元素}且需做去重处理
        #得到的结果为: [(-2.0, 0.816496580927726), (-1.3333333333333333, 0.4714045207910317)]
    def fit(self,X,y):
        labels=list(set(y))
        #set() 函数创建集合
        #即labels中的元素是y中的所有元素做去重处理得到的
        data={
   
   label:[] for label in labels}
        for f,label in zip(X,y):
            data[label].append(f)
        #得到的data是一个集合:key:y中的一个元素,value:包含X中的一些数组
        #将X中的数组划分为len(labels)种,第一个label对应的value值是X中的前len(X)/len(label)种
        #比如若labels: [1, 2],X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
        #则:因为labels含有2个元素,所以将X中的元素划分为2类,一个label对应一类
        #结果:{1:[array([-1, -1]),array([-2, -1]),array([-3, -2])],2:[array([1,1]),array([2,1]),array([3,2])]}
        self.model={
   
   label:self.summarize(value) for label,value in data.items()}
        #得到的data是集合形式,key:labels的值
        #value:将每个数组的相同位置看作是一类指标的不同取值,这一类指标的均值和方差组成一个元祖作为value
        #延续上面的例子:
        #self.model {1: [(-2.0, 0.816496580927726), (-1.3333333333333333, 0.4714045207910317)], 2: [(2.0, 0.816496580927726), (1.3333333333333333, 0.4714045207910317)]}

        return 'GaussianNB train done'
    def calculate(self,input_data):
        #计算概率<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值