机器学习 --- 高斯混合聚类

第1关:高斯混合聚类的核心思想

第2关:实现高斯混合聚类

import numpy as np
from scipy.stats import multivariate_normal
import numpy as np
 
def multiGaussian(x,mu,sigma):
    return 1/((2*np.pi)*pow(np.linalg.det(sigma),0.5))*np.exp(-0.5*(x-mu).dot(np.linalg.pinv(sigma)).dot((x-mu).T))
 
def computeGamma(X,mu,sigma,alpha,multiGaussian):
    n_samples=X.shape[0]
    n_clusters=len(alpha)
    gamma=np.zeros((n_samples,n_clusters))
    p=np.zeros(n_clusters)
    g=np.zeros(n_clusters)
    for i in range(n_samples):
        for j in range(n_clusters):
            p[j]=multiGaussian(X[i],mu[j],sigma[j])
            g[j]=alpha[j]*p[j]
        for k in range(n_clusters):
            gamma[i,k]=g[k]/np.sum(g)
    return gamma
 
class GMM(object):
    def __init__(self, n_components, max_iter=100):
        '''
        构造函数
        :param n_components: 想要划分成几个簇,类型为int
        :param max_iter: EM的最大迭代次数
        '''
        self.n_components = n_components
        self.ITER = max_iter
 
    def fit(self, train_data):
        '''
        训练,将模型参数分别保存至self.alpha,self.mu,self.sigma中
        :param train_data: 训练数据集,类型为ndarray
        :return: 无返回
        '''
        n_samples,n_features=train_data.shape
        
        mu=train_data[np.random.choice(range(n_samples),self.n_components )]
       
        alpha=np.ones(self.n_components )/self.n_components 
        
        
        sigma=np.full((self.n_components ,n_features,n_features),np.diag(np.full(n_features,0.1)))
        for i in range(self.ITER):
            gamma=computeGamma(train_data,mu,sigma,alpha,multiGaussian)
            alpha=np.sum(gamma,axis=0)/n_samples
            for i in range(self.n_components ):
                mu[i]=np.sum(train_data*gamma[:,i].reshape((n_samples,1)),axis=0)/np.sum(gamma,axis=0)[i]
                sigma[i]=0
                for j in range(n_samples):
                    sigma[i]+=(train_data[j].reshape((1,n_features))-mu[i]).T.dot((train_data[j]-mu[i]).reshape((1,n_features)))*gamma[j,i]
                sigma[i]=sigma[i]/np.sum(gamma,axis=0)[i]
        self.mu=mu
        self.sigma=sigma
        self.alpha=alpha
 
    def predict(self, test_data):
        '''
        预测,根据训练好的模型参数将test_data进行划分。
        注意:划分的标签的取值范围为[0,self.n_components-1],即若self.n_components为3,则划分的标签的可能取值为0,1,2。
        :param test_data: 测试集数据,类型为ndarray
        :return: 划分结果,类型为你ndarray
        '''
 
        #********* Begin *********#
        pred=computeGamma(test_data,self.mu,self.sigma,self.alpha,multiGaussian)
        results=np.argmax(pred,axis=1)
        return results
        #********* End *********#

第3关:图像分割

from PIL import Image
import numpy as np
from sklearn.mixture import GaussianMixture

#******** Begin *********#

im = Image.open('./step3/image/test.jpg')
img = np.array(im)
img_reshape = img.reshape(-1,3)
gmm = GaussianMixture(n_components=3,covariance_type='full')
pred = gmm.fit_predict(img_reshape)
img_reshape[pred == 0, :] = [255,255,0]
img_reshape[pred==1,:] = [0,0,255]
img_reshape[pred==2,:] = [0,255,0]
im = Image.fromarray(img.astype('uint8'))
im.save('./step3/dump/result.jpg')

#********* End *********#

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值