標籤: 貨運

  • 為什麼用抓包工具看HTTPS包是明文的

    為什麼用抓包工具看HTTPS包是明文的

    測試或者開發調試的過程中,經常會進行抓包分析,並且裝上抓包工具的證書就能抓取 HTTPS 的數據包並显示。由此就產生了一個疑問,為什麼抓包工具裝上證書後就能抓到 HTTPS 的包並显示呢?不是說 HTTPS 是加密傳輸的嗎?

    今天這篇文章就來探究下上面這個問題,要解釋清楚這個問題,我會通過解答以下兩個問題來講述:

    1. HTTPS 到底是什麼?
    2. 抓包工具抓包的原理?

    HTTPS 到底是什麼

    HTTP 作為一種被廣泛使用的傳輸協議,也存在一些的缺點:

    1. 無狀態(可以通過 Cookie 或 Session 解決);
    2. 明文傳輸;
    3. 不安全;

    為了解決 “明文” 和 “不安全” 兩個問題,就產生了 HTTPSHTTPS 不是一種單獨的協議,它是由 HTTP + SSL/TLS 組成。

    HTTP與HTTPS

    所以要理解 HTTPS 就只需在 HTTP 的基礎上理解 SSL/TLS (TLS 是 SSL 的後續版本,現在一般使用 TLS),下面就來了解下 TLS 是什麼。

    TLS

    傳輸層安全性協議(英語:Transport Layer Security,縮寫:TLS)及其前身安全套接層(英語:Secure Sockets Layer,縮寫:SSL)是一種安全協議,目的是為互聯網通信提供安全及數據完整性保障。

    TLS 由記錄協議、握手協議、警報協議、變更密碼規範協議、擴展協議等幾個子協議組成,綜合使用了對稱加密、非對稱加密、身份認證等許多密碼學前沿技術。

    • 記錄協議 規定
      TLS 收發數據的基本單位為:記錄。類似
      TCP 里的
      segment,所有其它子協議都需要通過記錄協議發出。
    • 警報協議 的職責是向對方發出警報信息,類似於
      HTTP 里的狀態碼。
    • 握手協議
      TLS 里最複雜的子協議,瀏覽器和服務器在握手過程中會協商
      TLS 版本號、隨機數、密碼套件等信息,然後交換證書和密鑰參數,最終雙方協商得到會話密鑰,用於後續的混合加密系統。
    • 變更密碼規範協議 用於告知對方,後續的數據都將使用加密傳輸。

    TLS 的握手過程:

    TLS握手過程

    握手過程抓包显示:

    TLS抓包
    TLS所傳輸的數據

    交換密鑰的過程為:

    1. 客戶端發起一個請求給服務器;
    2. 服務器生成一對非對稱的公鑰(
      pubkey)和私鑰(
      privatekey),然後把公鑰附加到一個
      CA数字證書 上返回給客戶端;
    3. 客戶端校驗該證書是否合法(通過瀏覽器內置的廠商根證書等手段校驗),然後從證書中提取出公鑰(
      pubkey);
    4. 客戶端生成一個隨機數(
      key),然後使用公鑰(
      pubkey)對這個隨機數進行加密后發送給服務器;
    5. 服務器利用私鑰(
      privatekey)對收到的隨機數密文進行解密得到
      key ;
    6. 後續客戶端和服務器傳輸數據使用該
      key 進行加密后再傳輸;

    抓包工具抓包的原理

    先來看看抓 HTTP 包的原理

    HTTP抓包過程

    1. 首先抓包工具會提供出代理服務,客戶端需要連接該代理;
    2. 客戶端發出
      HTTP 請求時,會經過抓包工具的代理,抓包工具將請求的原文進行展示;
    3. 抓包工具使用該原文將請求發送給服務器;
    4. 服務器返回結果給抓包工具,抓包工具將返回結果進行展示;
    5. 抓包工具將服務器返回的結果原樣返回給客戶端;

    抓包工具就相當於個透明的中間人,數據經過的時候它一隻手接到數據,然後另一隻手把數據傳出去。

    再來看看 HTTPS 的抓包

    HTTPS抓包過程

    這個時候抓包工具對客戶端來說相當於服務器,對服務器來說相當於客戶端。在這個傳輸過程中,客戶端會以為它就是目標服務器,服務器也會以為它就是請求發起的客戶端。

    1. 客戶端連接抓包工具提供的代理服務;
    2. 客戶端需要安裝抓包工具的根證書;
    3. 客戶端發出
      HTTPS 請求,抓包工具模擬服務器與客戶端進行
      TLS 握手交換密鑰等流程;
    4. 抓包工具發送一個
      HTTPS 請求給客戶端請求的目標服務器,並與目標服務器進行
      TLS 握手交換密鑰等流程;
    5. 客戶端使用與抓包工具協定好的密鑰加密數據后發送給抓包工具;
    6. 抓包工具使用與客戶端協定好的密鑰解密數據,並將結果進行展示;
    7. 抓包工具將解密后的客戶端數據,使用與服務器協定好的密鑰進行加密后發送給目標服務器;
    8. 服務器解密數據后,做對應的邏輯處理,然後將返回結果使用與抓包工具協定好的密鑰進行加密發送給抓包工具;
    9. 抓包工具將服務器返回的結果,用與服務器協定好的密鑰解密,並將結果進行展示;
    10. 抓包工具將解密后的服務器返回數據,使用與客戶端協定好的密鑰進行加密后發送給客戶端;
    11. 客戶端解密數據;

    總結

    • HTTPS 不是單獨的一個協議,它是
      HTTP +
      SSL/TLS 的組合;
    • TLS 是傳輸層安全性協議,它會對傳輸的
      HTTP 數據進行加密,使用非對稱加密和對稱加密的混合方式;
    • 抓包工具的原理就是“偽裝“,對客戶端偽裝成服務器,對服務器偽裝成客戶端;
    • 使用抓包工具抓
      HTTPS 包必須要將抓包工具的證書安裝到客戶端本地,並設置信任;
    • HTTPS 數據只是在傳輸時進行了加密,而抓包工具是接收到數據后再重新加密轉發,所以抓包工具抓到的
      HTTPS 包可以直接看到明文;

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    台北網頁設計公司這麼多該如何選擇?

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

    ※評比南投搬家公司費用收費行情懶人包大公開

    ※幫你省時又省力,新北清潔一流服務好口碑

    ※回頭車貨運收費標準

  • 【Mongodb】 可複製集搭建

    【Mongodb】 可複製集搭建

    可複製集 replica set

    概念圖

    可複製集需要至少3個以上的mongodb節點,其中有一個主節點promary,其餘的為副本節點secondary

    可複製集有三個角色:

    • 主要成員(Primary):主要接收所有寫操作。就是主節點。
    • 副本成員(Secondary):從主節點通過複製操作以維護相同的數據集,即備份數據,不可寫操作,但可以讀操作(但需要配置)。是默認的一種從節點類型。
    • 仲裁者(Arbiter):不保留任何數據的副本,只具有投票選舉作用。當然也可以將仲裁服務器維護為副本集的一部分,即副本成員同時也可以是仲裁者。也是一種從節點類型。

    關於仲裁者:
    如果主節點+副本節點是偶數推薦添加仲裁者,如果主節點+ 副本節點是奇數可以不添加仲裁者。仲裁者將永遠是仲裁者,而主要人員可能會退出並成為次要人員,而次要人員可能成為選舉期間的主要人員。

    為什麼要用可複製集?它有什麼重要性?

    1. 避免數據丟失,保障數據安全,提高系統安全性;
      (最少3節點,最大50節點)
    2. 自動化災備機制,主節點宕機后通過選舉產生新主機;提高系統健壯性;
      (7個選舉節點上限)
    3. 讀寫分離,負載均衡,提高系統性能;

    搭建

    準備三個mongodb節點

    正準備三個mongodb節點,我們先搭建一個主節點,2個副本節點的模式
    修改配置mongo.conf

    • 第一個
    systemLog:
      #MongoDB發送所有日誌輸出的目標指定為文件 
      destination: file
      #mongod或mongos應向其發送所有診斷日誌記錄信息的日誌文件的路徑 
      path: "/home/amber/mongodb/mongodb-001/log/mongod.log" 
      #當mongos或mongod實例重新啟動時,mongos或mongod會將新條目附加到現有日誌文件的末尾。 
      logAppend: true
    storage: 
      #mongod實例存儲其數據的目錄。storage.dbPath設置僅適用於mongod。 
      dbPath: "/home/amber/mongodb/mongodb-001/data/db" 
      journal:
        #啟用或禁用持久性日誌以確保數據文件保持有效和可恢復。 
        enabled: true
    processManagement:
      #啟用在後台運行mongos或mongod進程的守護進程模式。 
      fork: true 
      #指定用於保存mongos或mongod進程的進程ID的文件位置,其中mongos或mongod將寫入其PID 
      pidFilePath: "/home/amber/mongodb/mongodb-001/log/mongod.pid" 
    net:
      #服務實例綁定所有IP,有副作用,副本集初始化的時候,節點名字會自動設置為本地域名,而不是ip 
      #bindIpAll: true 
      #服務實例綁定的IP 
      bindIp: 0.0.0.0
      #bindIp 
      #綁定的端口 
      port: 27017
    replication: 
      #副本集的名稱 
      replSetName: myrs
    
    • 第二個第三個配置
      把上述文件中的mongodb-001換成mongodb-002``mongodb-003
      端口分別換成27018 27019

    然後分別在mongodb-00X的根目錄下執行啟動命令

    ./bin/mongod -f ./conf/mongod.conf
    

    檢查進程

    ps -ef|grep mongod
    

    設置主節點

    進入27017的那個mongod的客戶端,並且執行

    rs.initiate({
          _id: "myrs", //  需要和replSetName的名稱一致
          version: 1,
          members: [{ _id: 0, host : "192.168.xx.xx:27017" }]});
    

    或者

    rs.initiate({}) 
    

    執行結果

    提示:
    1)“ok”的值為1,說明創建成功。
    2)命令行提示符發生變化,變成了一個從節點角色,此時默認不能讀寫。稍等片刻,回車,變成主節  點。
    

    配置副本節點

    再27017的mongod客戶端,也就是主節點上執行192.168.xx.xx:27018是副本節點的ip和端口

    rs.add("192.168.xx.xx:27018")
    rs.add("192.168.xx.xx:27019")
    

    使用

    rs.status()
    

    就可以看到members會有三個節點了

    測試

    再主節點插入一條數據

    use article;
    db.comment.insert({name: "amber"})
    

    再從節點查看,結果

    這是因為需要再從節點再次進行

    rs.slaveok() // 確認當前節點是副本節點
    db.comment.find(); // 查看當前數據
    

    可以看到已經有數據了,這樣一主二從的可複製成功了

    如果關閉主節點,在從節點執行rs.status();
    可以看到原來的主節點的health變成了0

    27018變成了新的主節點

    主節點的選舉原則

    MongoDB在副本集中,主節點選舉的觸發條件:
    1) 主節點故障
    2) 主節點網絡不可達(默認心跳信息為10秒)
    3) 人工干預(rs.stepDown(600))

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

    【其他文章推薦】

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

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

    ※回頭車貨運收費標準

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

    ※超省錢租車方案

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

  • 【Spring註解驅動開發】使用InitializingBean和DisposableBean來管理bean的生命周期,你真的了解嗎?

    寫在前面

    在《【Spring註解驅動開發】如何使用@Bean註解指定初始化和銷毀的方法?看這一篇就夠了!!》一文中,我們講述了如何使用@Bean註解來指定bean初始化和銷毀的方法。具體的用法就是在@Bean註解中使用init-method屬性和destroy-method屬性來指定初始化方法和銷毀方法。除此之外,Spring中是否還提供了其他的方式來對bean實例進行初始化和銷毀呢?

    項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation

    InitializingBean接口

    1.InitializingBean接口概述

    Spring中提供了一個InitializingBean接口,InitializingBean接口為bean提供了屬性初始化后的處理方法,它只包括afterPropertiesSet方法,凡是繼承該接口的類,在bean的屬性初始化后都會執行該方法。InitializingBean接口的源碼如下所示。

    package org.springframework.beans.factory;
    public interface InitializingBean {
    	void afterPropertiesSet() throws Exception;
    }
    

    根據InitializingBean接口中提供的afterPropertiesSet()方法的名字可以推斷出:afterPropertiesSet()方法是在屬性賦好值之後調用的。那到底是不是這樣呢?我們來分析下afterPropertiesSet()方法的調用時機。

    2.何時調用InitializingBean接口?

    我們定位到Spring中的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory類下的invokeInitMethods()方法中,來查看Spring加載bean的方法。

    題外話:不要問我為什麼會是這個invokeInitMethods()方法,如果你和我一樣對Spring的源碼非常熟悉的話,你也會知道是這個invokeInitMethods()方法,哈哈哈哈!所以,小夥伴們不要只顧着使用Spring,還是要多看看Spring的源碼啊!Spring框架中使用了大量優秀的設計模型,其代碼的編寫規範和嚴謹程度也是業界開源框架中數一數二的,非常值得閱讀。

    我們來到AbstractAutowireCapableBeanFactory類下的invokeInitMethods()方法,如下所示。

    protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
        throws Throwable {
    	//判斷該bean是否實現了實現了InitializingBean接口,如果實現了InitializingBean接口,則調用bean的afterPropertiesSet方法
        boolean isInitializingBean = (bean instanceof InitializingBean);
        if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
            if (logger.isTraceEnabled()) {
                logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
            }
            if (System.getSecurityManager() != null) {
                try {
                    AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
                        //調用afterPropertiesSet()方法
                        ((InitializingBean) bean).afterPropertiesSet();
                        return null;
                    }, getAccessControlContext());
                }
                catch (PrivilegedActionException pae) {
                    throw pae.getException();
                }
            }
            else {
                //調用afterPropertiesSet()方法
                ((InitializingBean) bean).afterPropertiesSet();
            }
        }
    
        if (mbd != null && bean.getClass() != NullBean.class) {
            String initMethodName = mbd.getInitMethodName();
            if (StringUtils.hasLength(initMethodName) &&
                !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
                !mbd.isExternallyManagedInitMethod(initMethodName)) {
                //通過反射的方式調用init-method
                invokeCustomInitMethod(beanName, bean, mbd);
            }
        }
    }
    

    分析上述代碼后,我們可以初步得出如下信息:

    • Spring為bean提供了兩種初始化bean的方式,實現InitializingBean接口,實現afterPropertiesSet方法,或者在配置文件和@Bean註解中通過init-method指定,兩種方式可以同時使用。
    • 實現InitializingBean接口是直接調用afterPropertiesSet()方法,比通過反射調用init-method指定的方法效率相對來說要高點。但是init-method方式消除了對Spring的依賴。
    • 如果調用afterPropertiesSet方法時出錯,則不調用init-method指定的方法。

    也就是說Spring為bean提供了兩種初始化的方式,第一種實現InitializingBean接口,實現afterPropertiesSet方法,第二種配置文件或@Bean註解中通過init-method指定,兩種方式可以同時使用,同時使用先調用afterPropertiesSet方法,后執行init-method指定的方法。

    DisposableBean接口

    1.DisposableBean接口概述

    實現org.springframework.beans.factory.DisposableBean接口的bean在銷毀前,Spring將會調用DisposableBean接口的destroy()方法。我們先來看下DisposableBean接口的源碼,如下所示。

    package org.springframework.beans.factory;
    public interface DisposableBean {
    	void destroy() throws Exception;
    }
    

    可以看到,在DisposableBean接口中只定義了一個destroy()方法。

    在Bean生命周期結束前調用destory()方法做一些收尾工作,亦可以使用destory-method。前者與Spring耦合高,使用類型強轉.方法名(),效率高。後者耦合低,使用反射,效率相對低

    2.DisposableBean接口注意事項

    多例bean的生命周期不歸Spring容器來管理,這裏的DisposableBean中的方法是由Spring容器來調用的,所以如果一個多例實現了DisposableBean是沒有啥意義的,因為相應的方法根本不會被調用,當然在XML配置文件中指定了destroy方法,也是沒有意義的。所以,在多實例bean情況下,Spring不會自動調用bean的銷毀方法。

    單實例bean案例

    創建一個Animal的類實現InitializingBean和DisposableBean接口,代碼如下:

    package io.mykit.spring.plugins.register.bean;
    
    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.stereotype.Component;
    /**
     * @author binghe
     * @version 1.0.0
     * @description 測試InitializingBean接口和DisposableBean接口
     */
    public class Animal implements InitializingBean, DisposableBean {
        public Animal(){
            System.out.println("執行了Animal類的無參數構造方法");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("執行了Animal類的初始化方法。。。。。");
    
        }
        @Override
        public void destroy() throws Exception {
            System.out.println("執行了Animal類的銷毀方法。。。。。");
    
        }
    }
    

    接下來,我們新建一個AnimalConfig類,並將Animal通過@Bean註解的方式註冊到Spring容器中,如下所示。

    package io.mykit.spring.plugins.register.config;
    
    import io.mykit.spring.plugins.register.bean.Animal;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    /**
     * @author binghe
     * @version 1.0.0
     * @description AnimalConfig
     */
    @Configuration
    @ComponentScan("io.mykit.spring.plugins.register.bean")
    public class AnimalConfig {
        @Bean
        public Animal animal(){
            return new Animal();
        }
    }
    

    接下來,我們在BeanLifeCircleTest類中新增testBeanLifeCircle02()方法來進行測試,如下所示。

    @Test
    public void testBeanLifeCircle02(){
        //創建IOC容器
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnimalConfig.class);
        System.out.println("IOC容器創建完成...");
        //關閉IOC容器
        context.close();
    }
    

    運行BeanLifeCircleTest類中的testBeanLifeCircle02()方法,輸出的結果信息如下所示。

    執行了Animal類的無參數構造方法
    執行了Animal類的初始化方法。。。。。
    IOC容器創建完成...
    執行了Animal類的銷毀方法。。。。。
    

    從輸出的結果信息可以看出:單實例bean下,IOC容器創建完成后,會自動調用bean的初始化方法;而在容器銷毀前,會自動調用bean的銷毀方法。

    多實例bean案例

    多實例bean的案例代碼基本與單實例bean的案例代碼相同,只不過在AnimalConfig類中,我們在animal()方法上添加了@Scope(“prototype”)註解,如下所示。

    package io.mykit.spring.plugins.register.config;
    import io.mykit.spring.plugins.register.bean.Animal;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Scope;
    /**
     * @author binghe
     * @version 1.0.0
     * @description AnimalConfig
     */
    @Configuration
    @ComponentScan("io.mykit.spring.plugins.register.bean")
    public class AnimalConfig {
        @Bean
        @Scope("prototype")
        public Animal animal(){
            return new Animal();
        }
    }
    

    接下來,我們在BeanLifeCircleTest類中新增testBeanLifeCircle03()方法來進行測試,如下所示。

    @Test
    public void testBeanLifeCircle03(){
        //創建IOC容器
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AnimalConfig.class);
        System.out.println("IOC容器創建完成...");
        System.out.println("-------");
        //調用時創建對象
        Object bean = ctx.getBean("animal");
        System.out.println("-------");
        //調用時創建對象
        Object bean1 = ctx.getBean("animal");
        System.out.println("-------");
        //關閉IOC容器
        ctx.close();
    }
    

    運行BeanLifeCircleTest類中的testBeanLifeCircle03()方法,輸出的結果信息如下所示。

    IOC容器創建完成...
    -------
    執行了Animal類的無參數構造方法
    執行了Animal類的初始化方法。。。。。
    -------
    執行了Animal類的無參數構造方法
    執行了Animal類的初始化方法。。。。。
    -------
    

    從輸出的結果信息中可以看出:在多實例bean情況下,Spring不會自動調用bean的銷毀方法。

    好了,咱們今天就聊到這兒吧!別忘了給個在看和轉發,讓更多的人看到,一起學習一起進步!!

    項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation

    寫在最後

    如果覺得文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公眾號,跟冰河學習Spring註解驅動開發。公眾號回復“spring註解”關鍵字,領取Spring註解驅動開發核心知識圖,讓Spring註解驅動開發不再迷茫。

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

    【其他文章推薦】

    ※超省錢租車方案

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

    ※回頭車貨運收費標準

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

    FB行銷專家,教你從零開始的技巧

  • 一文讀懂:GBDT梯度提升

    一文讀懂:GBDT梯度提升

    先縷一縷幾個關係:

    • GBDT是gradient-boost decision tree
    • GBDT的核心就是gradient boost,我們搞清楚什麼是gradient boost就可以了
    • GBDT是boost中的一種方法,boost還有XGBoost,adaboost。

    基本概念

    【Boost】就是讓多個弱分類器,通過不同的集成方式,來讓多個弱分類器變成一個強分類器。

    【gradient-boost】 梯度提升。簡單的說,先訓練一個弱分類器,然後弱分類器和目標值之間的殘差,作為下一個弱分類器訓練的目標值。這裡有一個非常簡單的例子

    • 第一個模型預測年齡,雖然真實值是30歲,第一個模型只給出了20歲的估計值;
    • 第二棵樹要預測的就是這個10歲的殘差,但是第二棵樹只給出了6歲的估計值;
    • 第三棵樹預測的是第二棵樹的4歲的殘差,但是………………(禁止套娃)

    梯度 or 殘差 ?

    對於GBDT,網上的很多文章都沒有講清楚,學習梯度還是學習殘差?從上面的那個例子來看,是學習殘差的。

    其實,從來GBDT都是學習梯度的,學習殘差只是學習梯度的一個特例!

    如果我們是在做一個回歸任務(就像是上面例子中預測年齡),採用平方損失:\(loss = \frac{1}{2}\sum^n_i{(y_i-\hat{y_i})^2}\)
    其中\(y_i\)是真實數值,\(\hat{y_i}\)是模型預測的值。

    然後想求取這個關於\(\hat{y_i}\)的梯度,那就是:
    \(\frac{\partial loss}{\partial \hat{y^i}}=(-1)(y_i-\hat{y_i})\)

    所以殘差在平方損失的情況下,就是等於負梯度,所以兩者一回事。

    殘差過於敏感

    對於數據不幹凈,沒有清晰掉異常值的數據樣本。使用平方損失對異常值過於敏感了

    所以,這裡在回歸問題中,也可以考慮使用下面的兩個損失函數:

    • Absolute loss:
      \(loss=|y-\hat{y}|\)

    • Huber loss:
      這個是設置一個閾值,當\(|y-\hat{y}|\)小於這個閾值的時候,採用平方損失,當\(|y-\hat{y}|\)大於這個閾值的時候,採用類似於絕對損失的線性損失:

      這裏看一下huber loss的函數圖像:

      就是一個平方損失,一個線性損失。

    然後看一下平方損失,絕對損失,huber損失對於異常值的容忍程度:

    CART回歸樹分裂思路(可不看)

    其實這個問題看起來問的不明所以,其實是問你決策樹如何選擇特徵的。從上面的例子可以看出來,GDBT應該是處理回歸問題的(處理連續數據的)。當然,GDBT也有辦法處理分類問題,只是這裏就不說了,這裏主要說GDBT怎麼處理回歸問題的,回歸問題能處理,那麼總有回歸離散化的辦法的

    這個問題是在問:CART TREE如何選擇特徵的CART TREE就是回歸決策樹,就是之前提到的弱分類器。

    一個決策樹,希望讀者已經有一個大概的理解了。簡單說就是:樣本可以根據的特徵A是否超過某一個閾值劃分成兩部分,然後劃分之後的每一個部分又可以根據某一個特徵是否超過某一個閾值再分成兩部分……

    這樣我們就要做出選擇了:每一個部分是根據哪一個特徵去劃分?根據這個特徵的哪一個數值作為閾值劃分?

    如果我們算力無窮,那麼自然可以遍歷每一個特徵,然後窮舉每一種可能的分割點,然後對比找到最優分割點。

    那麼如何判斷分割的點的好壞呢?得給出一個cost函數,或者叫做loss函數這樣的東西吧。

    \(loss= \sum_{第一部分}{(y_i-me an(y_{第一部分}))^2}+\sum_{第二部分}{(y_i-mean(y_{第二部分}))^2}\)

    看一下這個公式,我把公式寫的太丑了。其實這個公式非常的好理解:現在根據某一個特徵值,根據某一個閾值把樣本分成了兩個部分:第一部分和第二部分。然後計算每一個部分的樣本的label的均值,也就是公式中的:\(mean(y_{第一部分})\),\(mean(y_{第二部分})\),然後計算第一部分中所有樣本的label與第一部分label均值之間的差的平方和,同樣的過程計算第二個部分的,兩個相加起來就是這個loss。選擇能夠讓這個loss最小的分割特徵和分割閾值,就是我們要找的東西。

    其實我在學這一塊的時候,發現這個過程像是什麼?像不像聚類算法,通過上面的loss的最小化的過程,把一堆樣本分成兩類,讓兩類的類內距離最小。那個均值就像是求類中心點,計算每一個label距離類中心點的距離。(這一段看不懂也沒事

    喜歡的話請關注我們的微信公眾號~【你好世界煉丹師】。

    • 公眾號主要講統計學,數據科學,機器學習,深度學習,以及一些參加Kaggle競賽的經驗。
    • 公眾號內容建議作為課後的一些相關知識的補充,飯後甜點。
    • 此外,為了不過多打擾,公眾號每周推送一次,每次4~6篇精選文章。

    微信搜索公眾號:你好世界煉丹師。期待您的關注。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    台北網頁設計公司這麼多該如何選擇?

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

    ※評比南投搬家公司費用收費行情懶人包大公開

    ※幫你省時又省力,新北清潔一流服務好口碑

    ※回頭車貨運收費標準

  • 地球暖化冰河融解 北極新發現5座島嶼

    摘錄自2019年10月23日民視新聞報導

    俄羅斯研究人員23日表示,他們在北極偏遠地區發現了5座新島,目前還沒有命名研究人員是在法蘭士約瑟夫地群島,發現這5座新島嶼。島嶼原本為冰河覆蓋,因為冰河融化的關係,才被人發現。從無人機空拍畫面可以看到島嶼上有北極熊和海象等動物居住。

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

    【其他文章推薦】

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

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

    ※回頭車貨運收費標準

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

    ※超省錢租車方案

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

  • 一種失去飛翔能力的鳥 使科學家重拾對環境的希望

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

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

    【其他文章推薦】

    ※超省錢租車方案

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

    ※回頭車貨運收費標準

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

    FB行銷專家,教你從零開始的技巧

  • 氣候暖化影響冬眠 俄羅斯小獾提早甦醒

    摘錄自2020年2月13日公視報導

    受到暖冬影響,冬眠的動物提早甦醒,像是在俄羅斯,動物園裡的獾原本應該睡到月底,卻在月初就爬起來玩。

    在俄羅斯西伯利亞城市伊爾庫茨克的動物園,發現有兩隻獾,在二月的第一週就醒來一起玩,牠們去年這時候還在冬眠,當時還跟往年作息一樣,睡到月底。助理獸醫史達茲卡雅表示:「牠們都是小獾,也就是新生代。成年的獾都還在睡覺,牠們冬眠會比較久。」

    這個月10號,當地氣溫攝氏兩度,但去年的同一天,氣溫為零下24度。此外,動物園內這隻名為藍波的刺蝟,也在上週跑出來活動,園方表示,通常這表示春天就快到了,史達茲卡雅說:「動物比我們的感覺還要強,牠們更能適應大自然的改變,牠們也會比較早感覺得到。」

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

    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    台北網頁設計公司這麼多該如何選擇?

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

    ※評比南投搬家公司費用收費行情懶人包大公開

    ※幫你省時又省力,新北清潔一流服務好口碑

    ※回頭車貨運收費標準

  • 智利全國禁用膠袋 成南美首例寫下歷史

    摘錄自2018年8月5日蘋果日報智利報導

    全球吹起減少塑膠廢物的環保浪潮,智利昨天(4日)立法禁止全國商業活動使用塑膠袋,成為南美洲首個邁出「限塑」一大步的國家。

    當地的大型企業有6個月緩衝期逐步停用塑膠袋,小型企業則有2年時間適應新規定。智利政府公報(Diario Oficial)列出全國將禁止任何形式的塑膠袋,但不包括直接包裝且用於「衞生必要或防止食物浪費」的塑膠袋。違例者將被罰款370美元(約1萬1330元台幣)。

    智利國會早於6月1日已通過此法例,然而「工業塑膠聯盟」認為新例違憲,但已遭憲法法院駁回。

    智利政府指,國內塑膠垃圾問題達到驚人的程度,全國每年使用32億個塑膠袋,每位國民平均使用約200個。

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

    【其他文章推薦】

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

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

    ※回頭車貨運收費標準

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

    ※超省錢租車方案

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

  • 輻射土由農家所有 福島農民告東電遭駁回

    摘錄自2019年10月17日TVBS報導

    日本在2011年發生了311大地震,伴隨而來的海嘯造成了福島第一核電廠爆炸,引發大規模輻射外洩,福島縣海洋、土壤受災嚴重。災後,當地農民依照國家規定,將農地進行翻土等除染作業,產出稻米也都符合安全值,卻喚不回消費者瓦解的信心。當地農家因此聚集控告東京電力公司,要求必須負責更換新土壤,以將田地輻射值降回核災前。但地方法院卻認為,落入農田的輻射已不歸電力公司管理,而是歸地主所有,因此駁回了農民控訴。

    法院的裁決令農民們大失所望,但他們並不認輸,決定再上訴,不只是為自己討公道,更是要種出安心又安全、可以代代相傳的好米。

    福島農民鈴木博之表示:「想到過去的美好就很心痛,我討厭沒有成績的工作,不管怎麼拚命都是原地踏步。」 鈴木先生在地震前創立了自我品牌,農產品自產自銷,更開設了米食店,賣著自家米做的麻糬、飯糰,眼看生意越做越好,沒想到遭遇了既是天災也是人禍的地震與核災。他說,「祖先交給我肥沃的田地,卻在我這代被弄髒了,我要讓它再變回原樣,傳承給下一代。」

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

    【其他文章推薦】

    ※超省錢租車方案

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

    ※回頭車貨運收費標準

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

    FB行銷專家,教你從零開始的技巧

  • 颱風哈吉貝襲日滿月 農林漁損恐直逼西日本豪雨

    摘錄自2019年11月12日中央社報導

    颱風哈吉貝10月12日侵襲日本,到12日屆滿1個月,目前已知至少造成90人死亡、5人失蹤,目前掌握農林漁業損失已逾2200億日圓,未來可能直逼2018年西日本豪雨的逾3000億日圓。

    哈吉貝10月12日從日本伊豆半島登陸侵襲東日本地區,日本經濟新聞報導,目前已知至少造成90人死亡、5人失蹤,將近300條河川流經區域發生水災,逾9萬棟民宅受災;如果從發生884起土石災害來看,這是從1982年以來,單一個颱風所造成的最慘重災情。

    日本總務省消防廳表示,截至11日為止,全損或半損民宅超過1萬1000棟,淹水超過一樓地板高度的民宅超過3萬1000棟。

    日本內閣府表示,截至8日為止,仍有約2800人在避難所生活,且還有不少人因為家中受災,只能暫時借住在親戚家中。

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

    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    台北網頁設計公司這麼多該如何選擇?

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

    ※評比南投搬家公司費用收費行情懶人包大公開

    ※幫你省時又省力,新北清潔一流服務好口碑

    ※回頭車貨運收費標準