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):
#计算概率<
统计学习方法第四章朴素贝叶斯
最新推荐文章于 2024-04-23 14:00:43 发布