EM(Expection-Maximization)算法

贝叶斯分类中我们考虑了样本的属性独立性假设,一对一和一对多的依赖关系,那么在实际情况中,当属性有缺失时应该怎么办呢?此时可以引入EM算法解决问题。
首先来了解一下EM算法,又称期望最大化算法,算法分为两步,E步和M步,算法主要解决概率模型中含有观测变量和隐变量的样本。观测变量即给定数据已知样本属性值,可以用极大似然法或贝叶斯估计来估计模型参数,隐变量即样本的某种属性值有未知(我们知道数据可以分成两类,但是随机抽取一个数据点,我们不知道这个数据点属于第一类还是第二类,它的归属我们观察不到,因此引入一个隐含变量 z \boldsymbol{z} z来描述这个现象。)此时不能简单的采用这些方法。

常用场景

  1. 观测数据的点 X 既可以是离散的也可以是连续的,但每个数据点相关联都是一组观测向量。
  2. 丢失值 Z 是离散的,是从一组固定值中抽取的结果,每个观测值都与一个潜在变量关联。
  3. 参数是连续的,但是有两种:一种是参数与所有的数据点相关;另一种是参数与一个特定的隐变量相关。

已知某属性的概率模型,Y表示观测变量的数据,其概率分布 P ( Y ∣ θ ) P(Y|\theta) P(Yθ), θ \theta θ是需要估计的的模型参数, Z表示隐变量,其对数似然函数为 l o g P ( Y ∣ θ ) logP(Y|\theta) logP(Yθ),j假设Y和Z的联合概率分布为 P ( Y , Z ∣ θ ) , P(Y,Z|\theta),\quad P(Y,Zθ),则对于该属性的对数似然函数是 l o g P ( Y , Z ∣ θ ) logP(Y,Z|\theta) logP(Y,Zθ)

  • EM算法通过迭代求 L ( θ ) = l o g P ( Y ∣ θ ) = l o g ∑ z P ( Y , Z ∣ θ ) L(\theta)=logP(Y|\theta)=log\sum_zP(Y,Z|\theta) L(θ)=logP(Yθ)=logzP(Y,Zθ)的极大似然估计,每次迭代包含E步:求期望;M步:求极大化;
    首先选取参数的初值,记作 θ \theta θ,然后通过以下步骤迭代计算参数的估计值,直至收敛,第 i + 1 {i+1} i+1次的迭代过程如下:
  • E步
    计算在模型参数 θ i \theta^i θi下观测数据Y的期望
    Q ( θ , θ ( i ) ) = E z [ log ⁡ P ( Y , Z ∣ θ ) ∣ Y , θ ( i ) ] = ∑ Z log ⁡ P ( Y , Z ∣ θ ) P ( Z ∣ Y , θ ( i ) ) \begin{aligned} Q\left(\theta, \theta^{(i)}\right) &=E_{z}\left[\log P(Y, Z | \theta) | Y, \theta^{(i)}\right] \\ &=\sum_{Z} \log P(Y, Z | \theta) P\left(Z | Y, \theta^{(i)}\right) \end{aligned} Q(θ,θ(i))=Ez[logP(Y,Zθ)Y,θ(i)]=ZlogP(Y,Zθ)P(ZY,θ(i))
    其中,P(Z|Y, θ i \theta^i θi)是在给定数据Y和当前参数估计 θ i \theta^i θi下隐变量数据Z的条件概率分布。
  • M步
    求使得 Q ( θ , θ i ) Q(\theta,\theta^i) Q(θ,θi)极大化的 θ \theta θ,确定第i+1次的参数的估计值 θ i + 1 \theta^{i+1} θi+1,
    θ i + 1 = a r g m a x θ   Q ( θ , θ i ) \theta^{i+1}=argmax_{\theta} Q(\theta,\theta^i) θi+1=argmaxθ Q(θ,θi)
    重复上面的步骤直至收敛。
    注:
  1. 参数的初值可随意选择,但EM算法对初值是敏感的,
  2. Q ( θ , θ i ) Q(\theta,\theta^i) Q(θ,θi) θ \theta θ是要求的极大化的参数, θ i \theta^i θi是当前的参数估计值。
  3. Q函数是完全数据(Y+Z)的对数似然函数 l o g P ( Y , Z ∣ θ ) logP(Y,Z|\theta) logP(Y,Zθ关于在给定观测数据Y和当前参数 θ i \theta^i θi下对未观测数据Z的条件概率分布 P ( Z ∣ Y , θ i ) P(Z|Y,\theta^i) P(ZY,θi)的期望。
  4. 每次迭代是在求 Q Q Q函数及其极大。停止迭代的条件一般是对于较小的正数 ϵ 1 , ϵ 2 \epsilon_1,\epsilon_2 ϵ1,ϵ2,满足:
    ∣ ∣ θ i + 1 − θ i ∣ ∣ < ϵ 1 或 ∣ ∣ Q ( θ i + 1 , θ i ) − Q ( θ i , θ i ) ∣ ∣ < ϵ 2 ||\theta^{i+1}-\theta^i||<\epsilon_1\quad或\quad||Q(\theta^{i+1},\theta^i)-Q(\theta^i,\theta^i)||<\epsilon_2 θi+1θi<ϵ1Q(θi+1,θi)Q(θi,θi)<ϵ2
    则停止迭代。

EM算法在高斯混合模型中的应用

高斯混合模型即存在一个样本集中,不同的类符合不同参数的高斯分布,假设有N个样本,有K个类,有高斯分布 N 1 ( μ 1 , σ 1 2 ) , N 2 ( μ 2 , σ 2 2 ) , . . . , N k ( μ k , σ k 2 ) N_1(\mu_1,\sigma_1^2),N_2(\mu_2,\sigma_2^2),...,N_k(\mu_k,\sigma_k^2) N1(μ1,σ12),N2(μ2,σ22),...,Nk(μk,σk2)。取第k个模型的概率为 α k \alpha_k αk, y i y_i yi表示观测数据。
高斯混合模型一般是如下形式的概率分布模型:
P ( y ∣ θ ) = ∑ k = 1 K α k ϕ ( y ∣ θ k ) P(y|\theta)=\sum_{k=1}^K\alpha_k\phi(y|\theta_k) P(yθ)=k=1Kαkϕ(yθk)
其中K表示分模型的个数, α k > 0 , ∑ 1 K α k = 1 , θ k = ( μ k , σ k 2 ) , \alpha_k>0,\sum_1^K\alpha_k=1,\theta_k=(\mu_k,\sigma_k^2), αk>0,1Kαk=1,θk=(μk,σk2),
ϕ ( y ∣ θ k ) = 1 2 π σ k exp ⁡ ( − ( y − μ k ) 2 2 σ k 2 ) \phi\left(y | \theta_{k}\right)=\frac{1}{\sqrt{2 \pi} \sigma_{k}} \exp \left(-\frac{\left(y-\mu_{k}\right)^{2}}{2 \sigma_{k}^{2}}\right) ϕ(yθk)=2π σk1exp(2σk2(yμk)2)

  • E步
    估计样本数据由每个模型(类)生成的概率,对于每个观测数据 y i y_i yi(已知数据),它由第k个类生成的概率:
    γ ( i , k ) = α k ∗ ϕ ( x i ∣ μ k , σ k ) ∑ j = 1 K ϕ ( x i ∣ μ j , σ k ) = α k ∗ f μ k , σ k ( x i ) ∑ j = 1 K f μ k , σ k ( x i ) , 表 示 x i 属 于 第 k 个 类 ( 高 斯 分 模 型 ) 的 概 率 。 \gamma(i,k)=\frac{\alpha_k*\phi(x_i|\mu_k,\sigma_k)}{\sum_{j=1}^K\phi(x_i|\mu_j,\sigma_k)}=\frac{\alpha_k*f_{\mu_k,\sigma_k}(x_i)}{\sum_{j=1}^Kf_{\mu_k,\sigma_k}(x_i)},表示x_i属于第k个类(高斯分模型)的概率。 γ(i,k)=j=1Kϕ(xiμj,σk)αkϕ(xiμk,σk)=j=1Kfμk,σk(xi)αkfμk,σk(xi),xik
    上式中 μ , σ \mu,\sigma μσ同样也是估计值,因此采用迭代法,在计算 γ ( i , k ) \gamma(i,k) γ(i,k)时假定 μ , σ \mu,\sigma μ,σ已知(即设置初始值)。
  • M步
    由此可以算出任意一个 x i x_i xi的值属于第k个模型的概率。然后使用 x i ∗ γ ( i , k ) , k = 1 , 2 , . . , K x_i*\gamma(i,k),k={1,2,..,K} xiγ(i,k),k=1,2,..,K,
    然后将这些数据重新计算 μ i , σ i \mu_i,\sigma_i μi,σi, γ ^ j k \hat{\gamma}_{j k} γ^jk是迭代过程中在当前模型参数下的第j个观测数据来自第k个分模型的概率,称为观测数据 y j y_j yj的响应度。与上面的 γ ( i , k ) \gamma(i,k) γ(i,k)意义相同)。在参数最大化的过程中使用对数似然估计,由于极大似然估计可推得极大似然估计的结果与矩估计的结果近似相同,因此可以采用下面的方法进行参数的估计。
    μ ^ k = ∑ j = 1 N γ ^ j k ∗ y j ∑ j = 1 N γ ^ j k , k = 1 , 2 , ⋯   , K σ ^ k 2 = ∑ j = 1 N γ ^ j k ( y j − μ k ) 2 ∑ j = 1 N γ ^ j k , k = 1 , 2 , ⋯   , K α ^ k = ∑ j = 1 N γ ^ j k N \begin{array}{c}{\hat{\mu}_{k}=\frac{\sum_{j=1}^{N} \hat{\gamma}_{j k}* y_{j}}{\sum_{j=1}^{N} \hat{\gamma}_{j k}}, \quad k=1,2, \cdots, K}\\ \\ {\hat{\sigma}_{k}^{2}=\frac{\sum_{j=1}^{N} \hat{\gamma}_{j k}\left(y_{j}-\mu_{k}\right)^{2}}{\sum_{j=1}^{N} \hat{\gamma}_{j k}}, \quad k=1,2, \cdots, K}\end{array}\\ \hat{\alpha}_k=\frac{\sum_{j=1}^N\hat{\gamma}_{jk}}{N} μ^k=j=1Nγ^jkj=1Nγ^jkyj,k=1,2,,Kσ^k2=j=1Nγ^jkj=1Nγ^jk(yjμk)2,k=1,2,,Kα^k=Nj=1Nγ^jk
    其中 ∑ j = 1 N γ j k \sum_{j=1}^N\gamma_{jk} j=1Nγjk表示所有样本属于第k个分模型的概率相加之和。
    然后在迭代计算 γ ( i , k ) \gamma(i,k) γ(i,k)继续执行E步,M步,直至收敛(参数不再变化)。

举例:
假设有N=10000个样本,代表有10000个学生,已知每个样本有属性身高h和性别sex,假设样本身高分布符合高斯分布,显然男女符合不同的高斯分布。假设男生符合分布 N 1 ( μ 1 , σ 1 ) N_1(\mu_1,\sigma_1) N1(μ1,σ1),女生符合分布 N 2 ( μ 2 , σ 2 ) N_2(\mu_2,\sigma_2) N2(μ2,σ2)。已知先验概率P(x=男)=P(x=女)= π \pi π=0.5;
根据EM算法:

  • 首先为 μ 1 , μ 2 , σ 1 , σ 2 \mu_1,\mu_2,\sigma_1,\sigma_2 μ1,μ2,σ1,σ2赋初值。
  • 假设有样本h=1.80,根据初始模型参数值计算该样本为男或女的概率:
    P ( x = 男 ∣ h = 1.80 ) = P ( x = 男 ) ∗ f μ 1 , σ 1 ( h = 1.80 ) = m P(x=男|h=1.80)=P(x=男)*f_{\mu_1,\sigma_1}(h=1.80)=m P(x=h=1.80)=P(x=)fμ1,σ1(h=1.80)=m;
    P ( x = 女 ∣ h = 1.80 ) = P ( x = 女 ) ∗ f μ 1 , σ 1 ( h = 1.80 ) = n P(x=女|h=1.80)=P(x=女)*f_{\mu_1,\sigma_1}(h=1.80)=n P(x=h=1.80)=P(x=)fμ1,σ1(h=1.80)=n;
    同理,计算其他已知h的样本;
    然后得出分模型对于观测数据(已知数据) y j y_j yj的响应度
    γ ^ j k = α k ϕ ( y j ∣ θ k ) ∑ k = 1 K α k ϕ ( y j ∣ θ k ) , j = 1 , 2 , ⋯   , N ; k = 1 , 2 , ⋯   , K \hat{\gamma}_{j k}=\frac{\alpha_{k} \phi\left(y_{j} | \theta_{k}\right)}{\sum_{k=1}^{K} \alpha_{k} \phi\left(y_{j} | \theta_{k}\right)}, \quad j=1,2, \cdots, N ; \quad k=1,2, \cdots, K γ^jk=k=1Kαkϕ(yjθk)αkϕ(yjθk),j=1,2,,N;k=1,2,,K
    即: γ ^ ( j , 男 ) = π ∗ m π ∗ m + π ∗ n , γ ^ ( j , 女 ) = π ∗ n π ∗ m + π ∗ n \hat{\gamma}_{(j ,男)}=\frac{\pi*m}{\pi*m+\pi*n}, \hat{\gamma}_{(j ,女)}=\frac{\pi*n}{\pi*m+\pi*n} γ^(j)=πm+πnπmγ^(j,)=πm+πnπn
    然后更新数据,例如 1.80 ∗ γ ^ ( j , 女 ) 1.80* \hat{\gamma}_{(j,女)} 1.80γ^(j,), 1.80 ∗ γ ^ ( j , 男 ) \quad1.80*\hat{\gamma}_{(j,男)} 1.80γ^(j),将新得到的数据按照k=男,女的分模型分开,然后求参。
  • 然后求参数最大化,即:
    μ ^ k = ∑ j = 1 N γ ^ j k y j ∑ j = 1 N γ ^ j k , k = 1 , 2 σ ^ k 2 = ∑ j = 1 N γ ^ j k ( y j − μ k ) 2 ∑ j = 1 N γ ^ j k , k = 1 , 2 , α ^ k = ∑ j = 1 N γ ^ j k N , 相 当 于 求 P ( x = 男 ) , P ( x = 女 ) 上 面 的 1 , 2 分 别 代 表 男 女 。 \begin{array}{c}{\hat{\mu}_{k}=\frac{\sum_{j=1}^{N} \hat{\gamma}_{j k} y_{j}}{\sum_{j=1}^{N} \hat{\gamma}_{j k}}, \quad k=1,2}\\ \\ {\hat{\sigma}_{k}^{2}=\frac{\sum_{j=1}^{N} \hat{\gamma}_{j k}\left(y_{j}-\mu_{k}\right)^{2}}{\sum_{j=1}^{N} \hat{\gamma}_{j k}}, \quad k=1,2,}\end{array}\\ \hat{\alpha}_k=\frac{\sum_{j=1}^N\hat{\gamma}_{jk}}{N},相当于求P(x=男),P(x=女) 上面的1,2分别代表男女。 μ^k=j=1Nγ^jkj=1Nγ^jkyj,k=1,2σ^k2=j=1Nγ^jkj=1Nγ^jk(yjμk)2,k=1,2,α^k=Nj=1Nγ^jkP(x=)P(x=)1,2
  • 然后重复上面的步骤,直到收敛。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal
DEBUG=True
def debug(*args,**kwargs):
    global DEBUG
    if DEBUG:
        print(*args,**kwargs)
    
def phi(Y,mu_k,cov_k):
    norm=multivariate_normal(mean=mu_k,cov=cov_k)#高斯分布函数
    return norm.pdf(Y)
#E步计算期望(响应度,当前参数下样本属于第k个模型的概率)
def getExpectation(Y,mu,cov,alpha):
    N=Y.shape[0]
    K=alpha.shape[0]
    #判断是否只有一个模型或样本
    assert N>1,"must be more than one sample"
    assert K>1,"must be more than one model"
    #gamma响应度矩阵
    gamma=np.mat(np.zeros((N,K)))
    #prob各模型中所有样本出现的概率,gamma=alpha*prob
    prob=np.zeros((N,K))
    for k in range(K):
        prob[:,k]=phi(Y,mu[k],cov[k])
    prob=np.mat(prob)
    #计算响应度
    for k in range(K):
        gamma[:,k]=alpha[k]*prob[:,k]
    for i in range(N):
        gamma[i,:]/=np.sum(gamma[i,:])
    return gamma
#M步,计算均值,协方差矩阵,alpha各模型占总体的概率(初始设为均匀分布)
def maximize(Y,gamma):
    N,D=Y.shape
    #K表示模型数
    K=gamma.shape[1]
    mu=np.zeros((K,D))
    cov=[]
    alpha=np.zeros(K)
    for k in range(K):
        #Nk第k个模型对所有样本的响应度之和
        Nk=np.sum(gamma[:,k])
        #更新mu,mu[k,d]表示均值矩阵mu的第k各模型第d维的均值
        for d in range(D):
            mu[k,d]=np.sum(np.multiply(gamma[:,k],Y[:,d]))/Nk
        #更新cov  
        cov_k=np.mat(np.zeros((D,D)))
        for i in range(N):
            cov_k+=gamma[i,k]*(Y[i]-mu[k]).T*(Y[i]-mu[k])/Nk
       
        cov.append(cov_k)
        #更新alpha
        alpha[k]=Nk/N
    cov=np.array(cov)
    return mu,cov,alpha
def scale_data(Y):
    for i in range(Y.shape[1]):
        max_=Y[:,i].max()
        min_=Y[:,i].min()
        Y[:,i]=(Y[:,i]-min_)/(max_-min_)
    debug("Data scaled")
    return Y
def init_params(shape,K):
    N,D=shape
    mu=np.random.rand(K,D)
    cov=np.array([np.eye(D)]*K)
    alpha=np.array([1.0/K]*K)
    debug("Parameters initalized")
    debug('mu:',mu,'cov:',cov,'alpha:',alpha,sep='\n')
    return mu,cov,alpha
def GMM_EM(Y,K,times):
    Y=scale_data(Y)
    #print(Y)
    Y1=np.array(Y)
    mu,cov,alpha=init_params(Y.shape,K)
    for i in range(times):
        gamma=getExpectation(Y,mu,cov,alpha)
        mu,cov,alpha=maximize(Y,gamma)
        if i in (0,20,50):
            category=gamma.argmax(axis=1).flatten().tolist()[0]
            class1=np.array([Y1[i] for i in range(N) if category[i]==0])
            class2=np.array([Y1[i] for i in range(N) if category[i]==1])
            plt.plot(class1[:,0],class1[:,1],'rs',label='class1')
            plt.plot(class2[:,0],class2[:,1],'bo',label="class2")
            plt.legend(loc='best')
            plt.title('GMM Clustering By EM Algorithm,itercount={}'.format(i))
            plt.show()
    debug('{sep}Result {sep}'.format(sep='-'*20))
    debug("mu:", mu, "cov:", cov, "alpha:", alpha, sep="\n")
    return mu,cov,alpha
import matplotlib.pyplot as plt
DEBUG=True
Y=np.loadtxt('gmm.data')
matY=np.matrix(Y,copy=True)
K=2
mu,cov,alpha=GMM_EM(matY,K,100)

N=Y.shape[0]
gamma=getExpectation(matY,mu,cov,alpha)
category=gamma.argmax(axis=1).flatten().tolist()[0]
class1=np.array([Y[i] for i in range(N) if category[i]==0])
class2=np.array([Y[i] for i in range(N) if category[i]==1])
plt.plot(class1[:,0],class1[:,1],'rs',label='class1')
plt.plot(class2[:,0],class2[:,1],'bo',label="class2")
plt.legend(loc='best')
plt.title('GMM Clustering By EM Algorithm')
plt.show()

在这里插入图片描述

3.600000 79.000000
1.800000 54.000000
3.333000 74.000000
2.283000 62.000000
4.533000 85.000000
2.883000 55.000000
4.700000 88.000000
3.600000 85.000000
1.950000 51.000000
4.350000 85.000000
1.833000 54.000000
3.917000 84.000000
4.200000 78.000000
1.750000 47.000000
4.700000 83.000000
2.167000 52.000000
1.750000 62.000000
4.800000 84.000000
1.600000 52.000000
4.250000 79.000000
1.800000 51.000000
1.750000 47.000000
3.450000 78.000000
3.067000 69.000000
4.533000 74.000000
3.600000 83.000000
1.967000 55.000000
4.083000 76.000000
3.850000 78.000000
4.433000 79.000000
4.300000 73.000000
4.467000 77.000000
3.367000 66.000000
4.033000 80.000000
3.833000 74.000000
2.017000 52.000000
1.867000 48.000000
4.833000 80.000000
1.833000 59.000000
4.783000 90.000000
4.350000 80.000000
1.883000 58.000000
4.567000 84.000000
1.750000 58.000000
4.533000 73.000000
3.317000 83.000000
3.833000 64.000000
2.100000 53.000000
4.633000 82.000000
2.000000 59.000000
4.800000 75.000000
4.716000 90.000000
1.833000 54.000000
4.833000 80.000000
1.733000 54.000000
4.883000 83.000000
3.717000 71.000000
1.667000 64.000000
4.567000 77.000000
4.317000 81.000000
2.233000 59.000000
4.500000 84.000000
1.750000 48.000000
4.800000 82.000000
1.817000 60.000000
4.400000 92.000000
4.167000 78.000000
4.700000 78.000000
2.067000 65.000000
4.700000 73.000000
4.033000 82.000000
1.967000 56.000000
4.500000 79.000000
4.000000 71.000000
1.983000 62.000000
5.067000 76.000000
2.017000 60.000000
4.567000 78.000000
3.883000 76.000000
3.600000 83.000000
4.133000 75.000000
4.333000 82.000000
4.100000 70.000000
2.633000 65.000000
4.067000 73.000000
4.933000 88.000000
3.950000 76.000000
4.517000 80.000000
2.167000 48.000000
4.000000 86.000000
2.200000 60.000000
4.333000 90.000000
1.867000 50.000000
4.817000 78.000000
1.833000 63.000000
4.300000 72.000000
4.667000 84.000000
3.750000 75.000000
1.867000 51.000000
4.900000 82.000000
2.483000 62.000000
4.367000 88.000000
2.100000 49.000000
4.500000 83.000000
4.050000 81.000000
1.867000 47.000000
4.700000 84.000000
1.783000 52.000000
4.850000 86.000000
3.683000 81.000000
4.733000 75.000000
2.300000 59.000000
4.900000 89.000000
4.417000 79.000000
1.700000 59.000000
4.633000 81.000000
2.317000 50.000000
4.600000 85.000000
1.817000 59.000000
4.417000 87.000000
2.617000 53.000000
4.067000 69.000000
4.250000 77.000000
1.967000 56.000000
4.600000 88.000000
3.767000 81.000000
1.917000 45.000000
4.500000 82.000000
2.267000 55.000000
4.650000 90.000000
1.867000 45.000000
4.167000 83.000000
2.800000 56.000000
4.333000 89.000000
1.833000 46.000000
4.383000 82.000000
1.883000 51.000000
4.933000 86.000000
2.033000 53.000000
3.733000 79.000000
4.233000 81.000000
2.233000 60.000000
4.533000 82.000000
4.817000 77.000000
4.333000 76.000000
1.983000 59.000000
4.633000 80.000000
2.017000 49.000000
5.100000 96.000000
1.800000 53.000000
5.033000 77.000000
4.000000 77.000000
2.400000 65.000000
4.600000 81.000000
3.567000 71.000000
4.000000 70.000000
4.500000 81.000000
4.083000 93.000000
1.800000 53.000000
3.967000 89.000000
2.200000 45.000000
4.150000 86.000000
2.000000 58.000000
3.833000 78.000000
3.500000 66.000000
4.583000 76.000000
2.367000 63.000000
5.000000 88.000000
1.933000 52.000000
4.617000 93.000000
1.917000 49.000000
2.083000 57.000000
4.583000 77.000000
3.333000 68.000000
4.167000 81.000000
4.333000 81.000000
4.500000 73.000000
2.417000 50.000000
4.000000 85.000000
4.167000 74.000000
1.883000 55.000000
4.583000 77.000000
4.250000 83.000000
3.767000 83.000000
2.033000 51.000000
4.433000 78.000000
4.083000 84.000000
1.833000 46.000000
4.417000 83.000000
2.183000 55.000000
4.800000 81.000000
1.833000 57.000000
4.800000 76.000000
4.100000 84.000000
3.966000 77.000000
4.233000 81.000000
3.500000 87.000000
4.366000 77.000000
2.250000 51.000000
4.667000 78.000000
2.100000 60.000000
4.350000 82.000000
4.133000 91.000000
1.867000 53.000000
4.600000 78.000000
1.783000 46.000000
4.367000 77.000000
3.850000 84.000000
1.933000 49.000000
4.500000 83.000000
2.383000 71.000000
4.700000 80.000000
1.867000 49.000000
3.833000 75.000000
3.417000 64.000000
4.233000 76.000000
2.400000 53.000000
4.800000 94.000000
2.000000 55.000000
4.150000 76.000000
1.867000 50.000000
4.267000 82.000000
1.750000 54.000000
4.483000 75.000000
4.000000 78.000000
4.117000 79.000000
4.083000 78.000000
4.267000 78.000000
3.917000 70.000000
4.550000 79.000000
4.083000 70.000000
2.417000 54.000000
4.183000 86.000000
2.217000 50.000000
4.450000 90.000000
1.883000 54.000000
1.850000 54.000000
4.283000 77.000000
3.950000 79.000000
2.333000 64.000000
4.150000 75.000000
2.350000 47.000000
4.933000 86.000000
2.900000 63.000000
4.583000 85.000000
3.833000 82.000000
2.083000 57.000000
4.367000 82.000000
2.133000 67.000000
4.350000 74.000000
2.200000 54.000000
4.450000 83.000000
3.567000 73.000000
4.500000 73.000000
4.150000 88.000000
3.817000 80.000000
3.917000 71.000000
4.450000 83.000000
2.000000 56.000000
4.283000 79.000000
4.767000 78.000000
4.533000 84.000000
1.850000 58.000000
4.250000 83.000000
1.983000 43.000000
2.250000 60.000000
4.750000 75.000000
4.117000 81.000000
2.150000 46.000000
4.417000 90.000000
1.817000 46.000000
4.467000 74.000000
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值