import numpy as np
import math
classThree_coin:def__init__(self,pai=0.0,p=0.0,q=0.0):
self.pai = pai
self.p = p
self.q = q
defcomput_y_sita(self,y):return self.pai*self.p**y*(1-self.p)**(1-y)+(1-self.pai)*self.q**y*(1-self.q)**(1-y)deflog_P_Y_sita(self,X):
result =0for x in X:
result += math.log(self.comput_y_sita(x))return result
defcompute_ui(self,y):return self.pai*self.p**y*(1-self.p)**(1-y)/self.comput_y_sita(y)deffit(self,X,max_iter):
self.n =len(X)for i inrange(max_iter):
p_u1 = np.array([self.compute_ui(x)*x for x in X])
ui = np.array([self.compute_ui(x)for x in X])
q_ui = np.array([(1- self.compute_ui(x))*x for x in X])
self.pai =1/self.n*sum(ui)
self.p =sum(p_u1)/sum(ui)
self.q =sum(q_ui)/sum(1-ui)defmain():
X =[1,1,0,1,0,0,1,0,1,1]
Three_coin_ = Three_coin(0.46,0.55,0.67)
Three_coin_.fit(X,10)print(Three_coin_.pai,Three_coin_.p,Three_coin_.q)if __name__ =='__main__':
main()###result########################/usr/bin/python3 /Users/zhengyanzhao/PycharmProjects/tongjixuexi/shixian2/three_coin_model.py
0.4618628351139190.53459500378501120.6561346417857326
GMM高维高斯混合模型
import math
import numpy as np
classGausian_EM:def__init__(self,Y,k):
self.k = k
self.Y = np.array(Y)
self.feature_num =len(Y[0])
self.N =len(Y)
self.uk =[]
self.sik =[]for i inrange(k):
self.uk.append(np.random.rand(self.feature_num))
self.sik.append(np.random.rand(self.feature_num,self.feature_num))
self.ak = np.array([1/k]*k)
self.rjk = np.zeros((self.N,k))+0.001defcaculate_y_sita(self,y,k_index):
covdet = np.linalg.det(self.sik[k_index]+ np.eye(self.feature_num)*0.001)
covinv = np.linalg.inv(self.sik[k_index]+ np.eye(self.feature_num)*0.001)
denominator =((2*math.pi)**self.feature_num * np.abs(covdet))**(1/2)
numerator = np.exp(-0.5*((y-self.uk[k_index]).dot(covinv).dot(y-self.uk[k_index])))return numerator/denominator
defcompute_log_likelihood(self):
result =0for y in self.Y:
result += np.log(np.array(np.sum([self.caculate_y_sita(y,k)*self.ak[k]for k inrange(self.k)])))return result
deffit(self,max_iter):foriterinrange(max_iter):
log_likelihood = self.compute_log_likelihood()for n inrange(self.N):
denominator = np.sum([self.ak[k]* self.caculate_y_sita(self.Y[n], k)for k inrange(self.k)])for k_index inrange(self.k):
self.rjk[n][k_index]= self.ak[k_index]*self.caculate_y_sita(self.Y[n], k_index)/denominator
for k inrange(self.k):
self.ak[k]= np.sum([self.rjk[j][k]for j inrange(self.N)])/float(self.N)
self.sik[k]= np.sum([self.rjk[j][k]*((self.Y[j]-self.uk[k]).reshape(self.feature_num,1).dot((self.Y[j]-self.uk[k]).reshape(1,self.feature_num))) \
for j inrange(self.N)],axis=0)/np.sum([self.rjk[j][k]for j inrange(self.N)])print([self.Y[j]*self.rjk[j][k]for j inrange(self.N)])
self.uk[k]= np.sum([self.Y[j]*self.rjk[j][k]for j inrange(self.N)],axis=0)/np.sum([self.rjk[j][k]for j inrange(self.N)])## print('---------------------------')# print(self.ak)# print(self.sik)# print(self.uk)
new_log_likelihood = self.compute_log_likelihood()if new_log_likelihood - log_likelihood <0.0001:print('small fit')breakdefpredict(self,x):return np.argmax([self.caculate_y_sita(x,k)for k inrange(self.k)])defmain():
X =[]
Y =[]withopen('../data/iris.data','r')as f:for i in f:
data = i.split(',')
X.append([float(j)for j in data[:4]])
Y.append(data[4])
Y =[1if i =='Iris-setosa\n'else0for i in Y]
Gausian_EM_ = Gausian_EM(X,2)
Gausian_EM_.fit(50)print([Gausian_EM_.predict(x)for x in X])print(Y)if __name__ =='__main__':
main()#####result###################################
……
---------------------------[0.333328620.66667138][array([[0.12176211,0.09828544,0.01581506,0.01033654],[0.09828544,0.14226048,0.01144559,0.01120903],[0.01581506,0.01144559,0.02950403,0.00558421],[0.01033654,0.01120903,0.00558421,0.01126411]]), array([[0.43497483,0.12094219,0.44886966,0.16550395],[0.12094219,0.10961752,0.14138142,0.07923294],[0.44886966,0.14138142,0.674851,0.28587703],[0.16550395,0.07923294,0.28587703,0.17863612]])][array([5.00600713,3.41801571,1.46400229,0.24399922]), array([6.26198756,2.871996,4.90597454,1.67599028])]
small fit
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1][1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]