GMM

containDuplicateIII
采用二叉排序树,这是第一个,以为里面需要有一个查找nums[i]-t的第一个位置,然后看第一个元素是否<=nums[i]+t, 如果是的话,说明存在,否则就找不到了。

同时维护二叉排序树只有k个元素,如果超过k个元素一定,里面位于最前面的
元素一定是和当前查询的元素index差值超过k的。所以要维护k个元素的二叉排序树即可。

然后利用lower_bound函数就可以实现二叉查找了。

class Solution {
public:
    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
        int n=nums.size();
        deque<int> L;
        multiset<int> mul;
        for(int i=0;i<n;i++)
        {
            if(L.size()>k)
            {
                //int cur=;
                mul.erase(mul.find(L.front()));
                L.pop_front();
            }
            auto it=mul.lower_bound(nums[i]-t);
            if(it==mul.end() || (LL)*it>(LL)nums[i]+(LL)t)
            {
                L.push_back(nums[i]);
                mul.insert(nums[i]);
            }
            else return 1;
        }
        return 0;
    }
};

最坑爹的是,这里面用deque可以,但是list来模拟队列就不行。
可能是STL性能的差别。

http://blog.csdn.net/abcjennifer/article/details/8198352

GMM 模型是 一种混合模型,求解用EM算法。

高斯混合模型,多个高斯分布的混合,每个高斯分布有一个混合比例。
p(x)=sum(k=1->k) pi(k)N(x|k),
其中pi是每个分布的权重,N是高斯分布的概率密度函数

这是这个模型的定义。

我们用最大似然估计来求解模型,x1…xN, 每个数据都是从高斯分布中采样,概率p(xi), 因此最大似然估计就是使得这个数据产生的概率最大,假定独立同分布,因此直接乘积,用对数似然可以使得求解方便(Richael Zhang博客里说的是解决下溢的问题)

然后套用EM的框架,具体公式见Richael Zhang的博客,

E步生成r(i, k) 表示xi由第k个正式分布生成的概率
M步估算参数,K个均值向量和协方差矩阵,以及每个分布的混合权重

然后重复迭代直到似然函数收敛

模型:GMM
策略:最大似然估计
算法:EM

Posted by richard爱闹 - 6月 1 2015
如需转载,请注明: 本文来自 Richard