09_EM算法

  今天是2020年3月5日星期四。預計開學時間不會早於四月初,真是好消息,可以有大把的時間整理知識點(實際上發文章的時間都6月6號了,希望9月份能開學啊,不耽誤找工作~)。每次導師找,整個人會變的特別煩躁,煩躁加不安,其它事情一點都做不下去,焦慮。改小論文這幾天耽誤了一些時間,查了些EM算法的例子,怎樣理解這個算法呢?通過這周的學習,覺得數學公式有點唬人,但卻是理解該算法最好的形式。

  剛開始對這個算法一無所知,通過知乎、CSDN看資料,看白板視頻,看講解例子。越看例子越覺得負擔重,因為要先把例子理解了,再去理解這個知識點。例子不能徹底理解,知識點也走不下去,倒不如一遍一遍的看數學公式。看完了公式,再去看例子,朦朦朧朧的就懂了。之後再去看白板視頻,絕對是不一樣的體驗。

  先看別人的視頻,然後自己去推導公式,你會覺得困難摸不到頭腦;先自己去推導公式,再去看別人視頻,你會覺得心曠神怡一目瞭然。第一種做法,往往看視頻的時候就是懵懵噠,抓不住別人講述的重點;第二種做法,類似於先學會了九陽神功,再去和別人切磋武藝。初心是將《統計學習方法》這本書做詳細的心得筆記,現在有點鬆動,希望能堅持下去。

 GitHub:https://github.com/wangzycloud/statistical-learning-method

 EM算法

引入

  EM算法應該作為一種通用的求解方法,用於含有隱變量的概率模型參數的極大似然估計。拆開來看,這句話是應用在概率模型上的;用來估計概率模型的參數;類似於極大似然估計;求解的是含有隱變量的概率模型。那麼問題來了,什麼是該有隱變量的概率模型?概率模型是什麼樣子?極大似然估計?該方法是怎麼進行計算的呢?

  通常來講,EM算法是一種迭代算法,每次迭代由兩步組成:E步,求期望;M步:求極大,所以該算法被稱為期望極大算法。說該算法可以作為一種通用的求解方法,原因在於:該算法不是NBM、LR、SVM這類解決相應場景的模型,而是可以用於求解含有隱變量概率模型的參數估計。

  提到模型,腦子里第一印象有判別模型、生成模型。這裏的概率模型自然和判別模型、生成模型不在同一個層次。在我的理解里,概率模型是類似於樸素貝恭弘=叶 恭弘斯算法這種,用概率來表示最後的分類標準;而不是感知機、SVM這種利用確信度來表達分類結果的模型。再考慮一下樸素貝恭弘=叶 恭弘斯算法,特徵向量里的隨機變量X,以及表示類別的隨機變量Y,都是可以被觀測到變量。在所有隨機變量都可以觀測到的情況下,我們可以利用極大似然估計來求解模型的參數。對於含有隱變量的概率模型,要如何求解呢?含有隱變量意味着不能觀測到數據的全部狀況,也就沒有辦法直接利用極大似然估計來求解。

  現在看到的EM算法,就是一種求解含有隱變量的概率模型參數的極大似然估計方法。

EM算法

  書本上三硬幣模型,挺好的~代碼已整理到github中,實際上就是把書本公式用代碼實現出來…難度不大。

   文中提到,該問題沒有解析解,只有通過迭代的方法進行求解。仔細觀察一下公式(9.4),log(x)作用在公式(9.3)上,很明顯log連乘可以變成連加,但連加式子中的每個項仍然是連加式。好像是因為這個原因,就無法得到解析解了。個人對數學不感冒,只能硬性的記住“不容易求解析解”這點,至於原因,實在是搞不懂啊。雖然無法得到解析解,但我們可以通過EM算法求解,大致步驟如下:

   一般的,用Y表示觀測隨機變量的數據,Z表示隱隨機變量的數據,Y和Z連在一起稱為完全數據,觀測數據Y又稱為不完全數據。假設給定觀測數據Y,其概率分佈是P(Y|θ),其中θ是需要估計的模型參數,那麼不完全數據Y的似然函數是P(Y|θ),對數似然函數L(θ)=logP(Y|θ),假設Y和Z的聯合概率分佈是P(Y,Z|θ),那麼完全數據的對數似然函數是logP(Y,Z|θ)。

  EM算法通過迭代求解L(θ)=logP(Y|θ)的極大似然估計,每次迭代由兩個步驟:E步,M步組成。

  文中對Q函數做了具體解釋:

   關於EM算法的幾點說明,應該挺好理解的吧。步驟(1),迭代求解的方式需要一步步接近極值,是在某個解的基礎上,進一步求解。在最開始的時候,初值是任意選擇的,並且正是因為初值任意選擇,容易陷入局部極值,也就是對初值的選擇非常敏感(對比一下梯度下降的過程)。步驟(2),我們要清楚,求解的對象是變元參數θ。步驟(3),極大化的過程,詳見下圖~(θ,L(θ))圖像。步驟(4),迭代停止條件。

  EM算法的導出、收斂性,以及推廣詳見下圖吧~搞了四五天,弄了個流程…

GMM高斯混合模型

   書中公式一大堆,不太友好,手寫代碼的過程,就是把書本公式復現了一遍。難度不大,我認為需要先了解GMM模型是啥,再通過例子,熟悉一下計算過程,就可以掌握了。

  還是從生成數據的角度看,由GMM模型生成一個數據,是要根據一個普通的多項式分佈αk,來選擇第k個高斯分佈,分兩步生成數據。但是,這裏獲得的數據,並不知道來自第幾個αk,這就是隱變量了。

   對於高斯混合模型的參數估計,可以通過EM算法求解。

  1.明確隱變量,寫出完全數據的對數似然函數。

  2.EM算法的E步:確定Q函數。

  3.確定EM算法的M步。

  具體公式(9.26)-公式(9.32)就不一一摘錄了,github已復現。算法描述如下:

  本節整理的內容有些水…

代碼效果

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

對於單例模式面試官會怎樣提問呢?你又該如何回答呢?

前言

在面試的時候面試官會怎麼在單例模式中提問呢?你又該如何回答呢?可能你在面試的時候你會碰到這些問題:

  • 為什麼說餓漢式單例天生就是線程安全的?

  • 傳統的懶漢式單例為什麼是非線程安全的?

  • 怎麼修改傳統的懶漢式單例,使其線程變得安全?

  • 線程安全的單例的實現還有哪些,怎麼實現?

  • 雙重檢查模式、Volatile關鍵字 在單例模式中的應用

  • ThreadLocal 在單例模式中的應用

  • 枚舉式單例

那我們該怎麼回答呢?那答案來了,看完接下來的內容就可以跟面試官嘮嘮單例模式了

 

單例模式簡介

單例模式是一種常用的軟件設計模式,其屬於創建型模式,其含義即是一個類只有一個實例,併為整個系統提供一個全局訪問點 (向整個系統提供這個實)。

結構:

                      

單例模式三要素:

  • 私有的構造方法;

  • 私有靜態實例引用;

  • 返回靜態實例的靜態公有方法。

單例模式的優點

  • 在內存中只有一個對象,節省內存空間;

  • 避免頻繁的創建銷毀對象,可以提高性能;

  • 避免對共享資源的多重佔用,簡化訪問;

  • 為整個系統提供一個全局訪問點。

單例模式的注意事項

  在使用單例模式時,我們必須使用單例類提供的公有工廠方法得到單例對象,而不應該使用反射來創建,使用反射將會破壞單例模式 ,將會實例化一個新對象。

 

單線程實現方式

在單線程環境下,單例模式根據實例化對象時機的不同分為,

  • 餓漢式單例(立即加載)餓漢式單例在單例類被加載時候,就實例化一個對象並將引用所指向的這個實例;

  • 懶漢式單例(延遲加載),只有在需要使用的時候才會實例化一個對象將引用所指向的這個實例。

 

從速度和反應時間角度來講,餓漢式(又稱立即加載)要好一些;從資源利用效率上說,懶漢式(又稱延遲加載)要好一些。

餓漢式單例

// 餓漢式單例
public class HungrySingleton{
​
    // 私有靜態實例引用,創建私有靜態實例,並將引用所指向的實例
    private static HungrySingleton singleton = new HungrySingleton();
    // 私有的構造方法
    private HungrySingleton(){}
    //返回靜態實例的靜態公有方法,靜態工廠方法
    public static HungrySingleton getSingleton(){
        return singleton;
    }
}

餓漢式單例,在類被加載時,就會實例化一個對象並將引用所指向的這個實例;更重要的是,由於這個類在整個生命周期中只會被加載一次,只會被創建一次,因此惡漢式單例線程安全的。

那餓漢式單例為什麼是天生就線程安全呢?

因為類加載的方式是按需加載,且只加載一次。由於一個類在整個生命周期中只會被加載一次,在線程訪問單例對象之前就已經創建好了,且僅此一個實例。即線程每次都只能也必定只可以拿到這個唯一的對象。

懶漢式單例

// 懶漢式單例
public class LazySingleton {
    // 私有靜態實例引用
    private static LazySingleton singleton;
    // 私有的構造方法
    private LazySingleton(){}
    // 返回靜態實例的靜態公有方法,靜態工廠方法
    public static LazySingleton getSingleton(){
        //當需要創建類的時候創建單例類,並將引用所指向的實例
        if (singleton == null) {
            singleton = new LazySingleton();
        }
        return singleton;
    }
}

懶漢式單例是延遲加載,只有在需要使用的時候才會實例化一個對象,並將引用所指向的這個對象。

由於是需要時創建,在多線程環境是不安全的,可能會併發創建實例,出現多實例的情況,單例模式的初衷是相背離的。那我們需要怎麼避免呢?可以看接下來的多線程中單例模式的實現形式。

那為什麼傳統的懶漢式單例為什麼是非線程安全的?

非線程安全主要原因是,會有多個線程同時進入創建實例(if (singleton == null) {}代碼塊)的情況發生。當這種這種情形發生后,該單例類就會創建出多個實例,違背單例模式的初衷。因此,傳統的懶漢式單例是非線程安全的。

 

多線程實現方式

  在單線程環境下,無論是餓漢式單例還是懶漢式單例,它們都能夠正常工作。但是,在多線程環境下就有可能發生變異:

  • 餓漢式單例天生就是線程安全的,可以直接用於多線程而不會出現問題

  • 懶漢式單例本身是非線程安全的,因此就會出現多個實例的情況,與單例模式的初衷是相背離的。

 

那我們應該怎麼在懶漢的基礎上改造呢?

  • synchronized方法

  • synchronized塊

  • 使用內部類實現延遲加載

synchronized方法

// 線程安全的懶漢式單例
public class SynchronizedSingleton {
    private static SynchronizedSingleton synchronizedSingleton;
    private SynchronizedSingleton(){}
    // 使用 synchronized 修飾,臨界資源的同步互斥訪問
    public static synchronized SynchronizedSingleton getSingleton(){
        if (synchronizedSingleton == null) {
            synchronizedSingleton = new SynchronizedSingleton();
        }
        return synchronizedSingleton;
    }
}

  使用 synchronized 修飾 getSingleton()方法,將getSingleton()方法進行加鎖,實現對臨界資源的同步互斥訪問,以此來保證單例。

雖然可現實線程安全,但由於同步的作用域偏大、鎖的粒度有點粗,會導致運行效率會很低。

synchronized塊

// 線程安全的懶漢式單例
public class BlockSingleton {
    private static BlockSingleton singleton;
    private BlockSingleton(){}
    public static BlockSingleton getSingleton2(){
        synchronized(BlockSingleton.class){  // 使用 synchronized 塊,臨界資源的同步互斥訪問
            if (singleton == null) { 
                singleton = new BlockSingleton();
            }
        }
        return singleton;
    }
}

 其實synchronized塊跟synchronized方法類似,效率都偏低。

使用內部類實現延遲加載

// 線程安全的懶漢式單例
public class InsideSingleton {
    // 私有內部類,按需加載,用時加載,也就是延遲加載
    private static class Holder {
        private static InsideSingleton insideSingleton = new InsideSingleton();
    }
    private InsideSingleton() {
    }
    public static InsideSingleton getSingleton() {
        return Holder.insideSingleton;
    }
}
  • 如上述代碼所示,我們可以使用內部類實現線程安全的懶漢式單例,這種方式也是一種效率比較高的做法。其跟餓漢式單例原理是相同的, 但可能還存在反射攻擊或者反序列化攻擊 。

 

雙重檢查(Double-Check idiom)現實

雙重檢查(Double-Check idiom)-volatile

使用雙重檢測同步延遲加載去創建單例,不但保證了單例,而且提高了程序運行效率。

// 線程安全的懶漢式單例
public class DoubleCheckSingleton {
    //使用volatile關鍵字防止重排序,因為 new Instance()是一個非原子操作,可能創建一個不完整的實例
    private static volatile DoubleCheckSingleton singleton;
    private DoubleCheckSingleton() {
    }
​
    public static DoubleCheckSingleton getSingleton() {
        // Double-Check idiom
        if (singleton == null) {
            synchronized (DoubleCheckSingleton.class) {       
                // 只需在第一次創建實例時才同步
                if (singleton == null) {      
                    singleton = new DoubleCheckSingleton();      
                }
            }
        }
        return singleton;
    }
​
}

為了在保證單例的前提下提高運行效率,我們需要對singleton實例進行第二次檢查,為的式避開過多的同步(因為同步只需在第一次創建實例時才同步,一旦創建成功,以後獲取實例時就不需要同步獲取鎖了)。

但需要注意的必須使用volatile關鍵字修飾單例引用,為什麼呢?

 如果沒有使用volatile關鍵字是可能會導致指令重排序情況出現,在Singleton 構造函數體執行之前,變量 singleton可能提前成為非 null 的,即賦值語句在對象實例化之前調用,此時別的線程將得到的是一個不完整(未初始化)的對象,會導致系統崩潰。

此可能為程序執行步驟:

  1. 線程 1 進入 getSingleton() 方法,由於 singleton 為 null,線程 1 進入 synchronized 塊 ;

  2. 同樣由於 singleton為 null,線程 1 直接前進到 singleton = new DoubleCheckSingleton()處,在new對象的時候出現重排序,導致在構造函數執行之前,使實例成為非 null,並且該實例並未初始化的(原因在NOTE);

  3. 此時,線程 2 檢查實例是否為 null。由於實例不為 null,線程 2 得到一個不完整(未初始化)的 Singleton 對象

  4. 線程 1 通過運行 Singleton對象的構造函數來完成對該對象的初始化。

  這種安全隱患正是由於指令重排序的問題所導致的。而volatile 關鍵字正好可以完美解決了這個問題。使用volatile關鍵字修飾單例引用就可以避免上述災難。

NOTE

new 操作會進行三步走,預想中的執行步驟:

memory = allocate();        //1:分配對象的內存空間
ctorInstance(memory);       //2:初始化對象
singleton = memory;        //3:使singleton3指向剛分配的內存地址

**但實際上,這個過程可能發生無序寫入(指令重排序),可能會導致所下執行步驟:

memory = allocate();        //1:分配對象的內存空間
singleton3 = memory;        //3:使singleton3指向剛分配的內存地址
ctorInstance(memory);       //2:初始化對象

雙重檢查(Double-Check idiom)-ThreadLocal

  藉助於 ThreadLocal,我們可以實現雙重檢查模式的變體。我們將臨界資源線程局部化,具體到本例就是將雙重檢測的第一層檢測條件 if (instance == null) 轉換為 線程局部範圍內的操作 。

// 線程安全的懶漢式單例
public class ThreadLocalSingleton 
    // ThreadLocal 線程局部變量
    private static ThreadLocal<ThreadLocalSingleton> threadLocal = new ThreadLocal<ThreadLocalSingleton>();
    private static ThreadLocalSingleton singleton = null;
    private ThreadLocalSingleton(){}
    public static ThreadLocalSingleton getSingleton(){
        if (threadLocal.get() == null) {        // 第一次檢查:該線程是否第一次訪問
            createSingleton();
        }
        return singleton;
    }
​
    public static void createSingleton(){
        synchronized (ThreadLocalSingleton.class) {
            if (singleton == null) {          // 第二次檢查:該單例是否被創建
                singleton = new ThreadLocalSingleton();   // 只執行一次
            }
        }
        threadLocal.set(singleton);      // 將單例放入當前線程的局部變量中 
    }
}

藉助於 ThreadLocal,我們也可以實現線程安全的懶漢式單例。但與直接雙重檢查模式使用,使用ThreadLocal的實現在效率上還不如雙重檢查鎖定。

 

枚舉實現方式

它不僅能避免多線程同步問題,而且還能防止反序列化重新創建新的對象,

直接通過Singleton.INSTANCE.whateverMethod()的方式調用即可。方便、簡潔又安全。

public enum EnumSingleton {
    instance;
    public void whateverMethod(){
        //dosomething
    }
}

 

 

測試單例線程安全性

 使用多個線程,並使用hashCode值計算每個實例的值,值相同為同一實例,否則為不同實例。

public class Test {
    public static void main(String[] args) {
        Thread[] threads = new Thread[10];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new TestThread();
​
        }
        for (int i = 0; i < threads.length; i++) {
            threads[i].start();
​
        }
    }
}
class TestThread extends Thread {
    @Override
    public void run() {
        // 對於不同單例模式的實現,只需更改相應的單例類名及其公有靜態工廠方法名即可
        int hash = Singleton5.getSingleton5().hashCode();  
        System.out.println(hash);
    }
}

 

 

小結

單例模式是 Java 中最簡單,也是最基礎,最常用的設計模式之一。在運行期間,保證某個類只創建一個實例,保證一個類僅有一個實例,並提供一個訪問它的全局訪問點 ,介紹單例模式的各種寫法:

  • 餓漢式單例(線程安全)

  • 懶漢式單例

    • 傳統懶漢式單例(線程安全);

    • 使用synchronized方法實(線程安全);

    • 使用synchronized塊實現懶漢式單例(線程安全);

    • 使用靜態內部類實現懶漢式單例(線程安全)。

  • 使用雙重檢查模式

    • 使用volatile關鍵字(線程安全);

    • 使用ThreadLocal實現懶漢式單例(線程安全)。

  • 枚舉式單例

 

各位看官還可以嗎?喜歡的話,動動手指點個,點個關注唄!!謝謝支持! 歡迎關注公眾號【Ccww技術博客】,原創技術文章第一時間推出

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※回頭車貨運收費標準

台中搬家公司費用怎麼算?

單獨囚禁在水池2年 日本311倖存海豚抑鬱離世

摘錄自2020年4月15日鏡週刊報導

國際動保組織「海豚計畫」(Dolphin project)報導指出,日本寬吻海豚「Honey」於2005年在日本太地町被捕獲,自此生活在千葉線犬吠埼海洋公園僅80平方公尺大的水池中,與另一隻海豚、46隻企鵝及數百種魚類一起生活。

311大地震後面臨觀光衰退和建築物老舊,2008年11月犬吠埼海洋公園被爆出營運困難負債,正尋找買家,去年初終於轉賣,但如今整個園區卻呈現廢棄狀態,也沒有遊客造訪,僅安排員工前來餵食。另一隻海豚於2017年死亡,「Honey」自此單獨每天在這廢棄的水池中游來游去,對習性群居的海豚而言,這無疑是極大的折磨。

動保組織「海豚計畫」曾試圖聯繫買下海豚「Honey」,盼為牠找到合適的居所安享晚年,但為時已晚,3月初「Honey」狀況已經不太好,3月29日牠因阻塞性腸炎,死在待了泰半生的水池。

國際新聞
日本
核災
展示動物
動物福利

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!

殼牌石油拚減碳 誓言最遲2050年達零排放

摘錄自2020年4月16日聯合報報導

國際石油天然氣巨擘荷蘭皇家殼牌集團(Royal Dutch Shell)今(16日)誓言,在2050年前要達成「碳中和」(Carbon Neutral)目標,和競爭對手英國石油公司(BP)的承諾一樣。

法新社報導,殼牌執行長范柏登(Ben vanBeurden)在聲明中表示,社會對於氣候變遷的期許瞬息萬變,殼牌需要再進一步自我要求,計畫最晚在2050年成為零排放的能源企業。殼牌將在2050年前把自家能源產品的「淨碳足跡」減少約65%;在2030年減少30%。

溫室氣體
能源議題
全球變遷
氣候變遷
能源轉型
國際新聞
殼牌
減碳宣言
零排放
石油

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

網頁設計最專業,超強功能平台可客製化

※別再煩惱如何寫文案,掌握八大原則!

日本大鯢數量急減 雜交問題嚴重 水族館推大鯢布偶提升國民關注

文:宋瑞文

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

※回頭車貨運收費標準

4歲男童閒晃突遇野豬群襲擊 身體遭啃食送醫不治

摘錄自2020年4月24日聯合報報導

印度近期發生一起驚悚案件,一位4歲男童21日在家中附近閒晃玩耍時,突遇野豬群襲擊,被拖進一處垃圾場中攻擊啃咬,事後警方發現男童時,他全身多處已被豬群啃食,直到男童父母到場後才識別出他的身份,而男童送醫後則宣告不治。

根據英國「太陽報」報導,男童哈沙(V. Harshavardhan)居住在印度海得拉巴(Hyderabad)的賽義達巴德(Saidabad),當地居民曾多次向地方政府投訴,反應受到野豬群干擾,當地人表示沒有辦法阻止這些野豬瘋狂奔跑,雖然野豬已經被趕走,但牠們還是會找到路回來。

生活環境
國際新聞
印度
野豬

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

網頁設計最專業,超強功能平台可客製化

※別再煩惱如何寫文案,掌握八大原則!

「福島套餐」:奧運選手的被曝風險 民團仍訴求停辦東奧(上)

文:宋瑞文(媽媽監督核電廠聯盟特約撰述)

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

※回頭車貨運收費標準

「福島套餐」:奧運選手的被曝風險 民團仍訴求停辦東奧(下)

文:宋瑞文(媽媽監督核電廠聯盟特約撰述)

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

科學家在北義空污粒子上檢出新冠病毒 傳播距離、病毒是否存活仍待釐清

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!

動物、人與環境健康一體的紓困方案 聯合國科學家提三點呼籲

整理:鄒敏惠(環境資訊中心記者)

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

網頁設計最專業,超強功能平台可客製化

※別再煩惱如何寫文案,掌握八大原則!