008.Kubernetes二進制部署Nginx實現高可用

一 Nginx代理實現kube-apiserver高可用

1.1 Nginx實現高可用


基於 nginx 代理的 kube-apiserver 高可用方案。

控制節點的 kube-controller-manager、kube-scheduler 是多實例部署,所以只要有一個實例正常,就可以保證高可用;

集群內的 Pod 使用 K8S 服務域名 kubernetes 訪問 kube-apiserver, kube-dns 會自動解析出多個 kube-apiserver 節點的 IP,所以也是高可用的;

在每個節點起一個 nginx 進程,後端對接多個 apiserver 實例,nginx 對它們做健康檢查和負載均衡;

kubelet、kube-proxy、controller-manager、scheduler 通過本地的 nginx(監聽 127.0.0.1)訪問 kube-apiserver,從而實現 kube-apiserver 的高可用;

從而基於 nginx 4 層透明代理功能實現 K8S 節點( master 節點和 worker 節點)高可用訪問 kube-apiserver 。

1.2 下載編譯Nginx

  1 [root@k8smaster01 ~]# cd /opt/k8s/work
  2 [root@k8smaster01 work]# wget http://nginx.org/download/nginx-1.15.3.tar.gz
  3 [root@k8smaster01 work]# tar -xzvf nginx-1.15.3.tar.gz
  4 [root@k8smaster01 ~]# cd /opt/k8s/work/nginx-1.15.3/
  5 [root@k8smaster01 nginx-1.15.3]# mkdir nginx-prefix
  6 [root@k8smaster01 nginx-1.15.3]# ./configure --with-stream --without-http --prefix=$(pwd)/nginx-prefix --without-http_uwsgi_module --without-http_scgi_module --without-http_fastcgi_module
  7 [root@k8smaster01 ~]# cd /opt/k8s/work/nginx-1.15.3/
  8 [root@k8smaster01 nginx-1.15.3]# make && make install



解釋:

  • –with-stream:開啟 4 層透明轉發(TCP Proxy)功能;
  • –without-xxx:關閉所有其他功能,這樣生成的動態鏈接二進製程序依賴最小。
  • [root@k8smaster01 ~]# cd /opt/k8s/work/nginx-1.15.3/
  • [root@k8smaster01 nginx-1.15.3]# ./nginx-prefix/sbin/nginx -v

1.3 驗證編譯后的Nginx

  1 [root@k8smaster01 ~]# cd /opt/k8s/work/nginx-1.15.3
  2 [root@k8smaster01 nginx-1.15.3]# ./nginx-prefix/sbin/nginx -v
  3 nginx version: nginx/1.15.3
  4 [root@k8smaster01 nginx-1.15.3]# ldd ./nginx-prefix/sbin/nginx	#查看 nginx 動態鏈接的庫
  5         linux-vdso.so.1 =>  (0x00007ffdda980000)
  6         libdl.so.2 => /lib64/libdl.so.2 (0x00007feb37300000)
  7         libpthread.so.0 => /lib64/libpthread.so.0 (0x00007feb370e4000)
  8         libc.so.6 => /lib64/libc.so.6 (0x00007feb36d17000)
  9         /lib64/ld-linux-x86-64.so.2 (0x00007feb37504000)



提示:由於只開啟了 4 層透明轉發功能,所以除了依賴 libc 等操作系統核心 lib 庫外,沒有對其它 lib 的依賴(如 libz、libssl 等),以便達到精簡編譯的目的。

1.4 安裝和部署Nginx

  1 [root@k8smaster01 ~]# cd /opt/k8s/work
  2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
  3 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
  4   do
  5     echo ">>> ${master_ip}"
  6     mkdir -p /opt/k8s/kube-nginx/{conf,logs,sbin}
  7   done						#創建Nginx目錄
  8 [root@k8smaster01 ~]# cd /opt/k8s/work
  9 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
 10 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
 11   do
 12     echo ">>> ${master_ip}"
 13     scp /opt/k8s/work/nginx-1.15.3/nginx-prefix/sbin/nginx  root@${master_ip}:/opt/k8s/kube-nginx/sbin/kube-nginx
 14     ssh root@${master_ip} "chmod a+x /opt/k8s/kube-nginx/sbin/*"
 15     ssh root@${master_ip} "mkdir -p /opt/k8s/kube-nginx/{conf,logs,sbin}"
 16   done						#分發Nginx二進制


1.5 配置Nginx 四層透明轉發

  1 [root@k8smaster01 ~]# cd /opt/k8s/work
  2 [root@k8smaster01 work]# cat > kube-nginx.conf <<EOF
  3 worker_processes 1;
  4 
  5 events {
  6     worker_connections  1024;
  7 }
  8 
  9 stream {
 10     upstream backend {
 11         hash $remote_addr consistent;
 12         server 172.24.8.71:6443        max_fails=3 fail_timeout=30s;
 13         server 172.24.8.72:6443        max_fails=3 fail_timeout=30s;
 14         server 172.24.8.73:6443        max_fails=3 fail_timeout=30s;
 15     }
 16 
 17     server {
 18         listen 127.0.0.1:8443;
 19         proxy_connect_timeout 1s;
 20         proxy_pass backend;
 21     }
 22 }
 23 EOF
 24 [root@k8smaster01 ~]# cd /opt/k8s/work
 25 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
 26 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
 27   do
 28     echo ">>> ${master_ip}"
 29     scp kube-nginx.conf  root@${master_ip}:/opt/k8s/kube-nginx/conf/kube-nginx.conf
 30   done						#分發Nginx四層透明代理配置文件


1.6 配置Nginx system

  1 [root@k8smaster01 ~]# cd /opt/k8s/work
  2 [root@k8smaster01 work]# cat > kube-nginx.service <<EOF
  3 [Unit]
  4 Description=kube-apiserver nginx proxy
  5 After=network.target
  6 After=network-online.target
  7 Wants=network-online.target
  8 
  9 [Service]
 10 Type=forking
 11 ExecStartPre=/opt/k8s/kube-nginx/sbin/kube-nginx -c /opt/k8s/kube-nginx/conf/kube-nginx.conf -p /opt/k8s/kube-nginx -t
 12 ExecStart=/opt/k8s/kube-nginx/sbin/kube-nginx -c /opt/k8s/kube-nginx/conf/kube-nginx.conf -p /opt/k8s/kube-nginx
 13 ExecReload=/opt/k8s/kube-nginx/sbin/kube-nginx -c /opt/k8s/kube-nginx/conf/kube-nginx.conf -p /opt/k8s/kube-nginx -s reload
 14 PrivateTmp=true
 15 Restart=always
 16 RestartSec=5
 17 StartLimitInterval=0
 18 LimitNOFILE=65536
 19 
 20 [Install]
 21 WantedBy=multi-user.target
 22 EOF


1.7 分發Nginx systemd

  1 [root@k8smaster01 ~]# cd /opt/k8s/work
  2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
  3 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
  4   do
  5     echo ">>> ${master_ip}"
  6     scp kube-nginx.service  root@${master_ip}:/etc/systemd/system/
  7   done


二 啟動並驗證

2.1 啟動Nginx

  1 [root@k8smaster01 ~]# cd /opt/k8s/work
  2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
  3 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
  4   do
  5     echo ">>> ${master_ip}"
  6     ssh root@${master_ip} "systemctl daemon-reload && systemctl enable kube-nginx && systemctl restart kube-nginx"
  7   done


2.2 檢查Nginx服務

  1 [root@k8smaster01 ~]# cd /opt/k8s/work
  2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
  3 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
  4   do
  5     echo ">>> ${master_ip}"
  6     ssh root@${master_ip} "systemctl status kube-nginx |grep 'Active:'"
  7   done


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

【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

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

澳洲野火肆虐動物缺糧 政府空投糧食救援

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

澳洲最近野火燎原,專家估計至少有8億隻野生動物被燒死或受到影響,澳洲當局星期一宣布將投入5000萬澳幣,約合10億新台幣,作為搶救野生動物與復原棲地的經費,而在新南威爾斯則已經空投兩噸的蔬菜糧食,讓當地瀕危的刷尾袋鼠等物種果腹救命。

從直升機上將一箱箱紅蘿蔔和蕃薯空投到地面,攝影機隨後捕捉到小型瀕危的刷尾岩袋鼠現身,抱著救命的糧食啃了起來。為了搶救倖存的野生動物,相關單位已經在國家公園內空投兩噸的蔬菜糧食。

澳洲當局同時在星期一宣布將砸下5000萬澳幣,約合10億台幣,作為救助野生動物的經費,澳洲環境部長表示,其中一半將用於野生動物的醫療照顧與安置,並致力復原被野火燒毀的棲地;另一半將用來搶救面臨生存危機的野生動物。

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

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

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

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

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

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

匈牙利農場出現H5N8禽流感 將撲殺5萬隻火雞

摘錄自2020年1月13日中央廣播電台報導

匈牙利國家食品安全局(NEBIH)今(13日)宣布,匈牙利西北部一座大型火雞場檢測出雞隻感染高致病性H5N8禽流感病毒株。

匈牙利國家食品安全局表示,這座大型火雞場內的所有火雞,估計超過5萬隻必須加以撲殺,並採取其他預防措施,以遏阻禽流感病毒擴散。

國家食安局表示,匈牙利將實施生禽與禽肉的運輸限制,以阻止禽流感病毒散播,並指H5N8禽流感病毒至今在歐洲並未出現人類感染的風險。

匈牙利北部的鄰邦斯洛伐克(Slovakia)10日也通報西部一處家庭養雞場(backyard poultry)檢測出H5N8禽流感病毒株,同時也是將近三年來,斯洛伐克首度檢測出家禽感染H5N8禽流感病毒株。

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

海洋暖化再創新高 能量如36億枚原子彈爆炸

摘錄自2020年1月14日星島日報、公共電視報導

13日發表的一項最新研究報告指出,世界各大海洋的暖化程度十分嚴重,2019年的海水溫度又再創下有紀錄以來的新高水平。科學家形容目前的情況,好比每一秒投放五枚廣島原子彈在海中。

由14位科學家組成的國際團隊合作進行研究,分析上世紀50年代到近年的據數,計算海洋水面至2,000米深的溫度。他們在科學期刊《大氣科學進展》內發表報告,指全球各地海洋暖化的速度愈來愈快。報告指出,在1955至1986年間,海洋暖化的步伐保持穩定,但在過去數十年加速。在1987至2019年間,海洋暖化程度是對上數十年的四倍半。

2019年的海洋溫度,比1981至2010年間的平均溫度高出攝氏0.075度。過去25年海洋吸收的熱力,相等於36億次廣島原子彈爆炸。

研究也顯示,過去5年同時也是有紀錄以來海洋溫度最高的5年。高溫除了使得海洋生物如珊瑚,魚類和海鳥消失,更會導致海平面上升,造成沿岸洪災,以及產生更多颶風,帶來嚴重災情。

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

【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

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

新品牌效應 台灣電動機車買氣加溫

台灣中央與地方政府推動電動機車多年,今年因為新品牌Gogoro加入市場而加強了業者間的競爭意識,同時帶動了消費者的買氣。

Gogoro的電動機車Smartscooter今年七月正式上市。在十月祭出降價策略後,十月的銷售量達680輛,比九月成長了106%,已是當月台北市機車掛牌數量第四名。台北市是目前Gogoro相關服務最完善的地區,除了有較密集的電池交換站外,也開始嘗試與超商業者合作,讓騎士能以超商為據點交換電池。

在Gogoro加入市場後,台灣電動機車的需求整體也隨之升高。今年十月,台灣整體電動車掛牌輛創下2012年元月開始推行電動機車以來的新高;電動車相關概念股的股價也跟著成長,後勢可期。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

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

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

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

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

中國:2015年新能源汽車銷量將超過美國

據國家工信部裝備工業司發佈的最新數據顯示,2015年前10個月,國內新能源汽車累計生產20.69萬輛,同比增長3倍。其中,純電動乘用車生產8.71萬輛,同比增長3倍,插電式混合動力乘用車生產4.55萬輛,同比增長3倍;純電動商用車生產5.93萬輛,同比增長9倍,插電式混合動力商用車生產1.50萬輛,同比增長88%。同時,2015年前十個月新能源汽車銷售17.11萬輛,同比增長2.9倍。其中純電動汽車銷售11.38萬輛,同比增長3.9倍;插電式混合動力汽車銷售5.73萬輛,同比增長1.8倍。   國家863節能與新能源汽車專案監理諮詢專家組組長王秉剛表示,2015年結束時,中國累計銷售量可能接近美國累計銷售量,中國和美國會成為世界上銷售新能源汽車最多的國家。   王秉剛指出,從發展勢頭來看,中國的發展勢頭高過美國,國內2015年的上半年銷售量超過美國同期的銷售量,相信2015年全年肯定超過美國今年的銷售量,增長趨勢高於美國,到明年中國可能會成為世界上新能源汽車累計銷售量最多的國家。   從2014年以來,中央政府密集發佈新能源汽車政策,這個時期也被認作為新能源汽車發展階段的推廣階段。目前,地方政府在新能源汽車推廣上也做出了很多努力,上海、北京、江蘇、浙江等省市推廣數量超過萬輛。新能源汽車在公共領域的推廣工作穩步推進,而私人領域已經成為推廣主體,新能源汽車有望進入快速發展期。   中國製造2025規劃中指出,到2020年新能源汽車銷量突破100萬輛,2025年突破300萬輛。   資料來源:科技日報

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

河北省:將新能源汽車應用到9大公共服務領域

河北省擴大公共服務領域用車範疇,將黨政機關公務車、機要通信車、執法執勤巡邏車、環衛車、郵政車、接送學生校車、城鄉公車(含農村客運車)、城市物流配送車、計程車等九個方面的新能源汽車納入公共服務領域範圍。   河北省要求,全省在新增或更換城市公車以及上述九類的汽車,必須換成新能源汽車,如果再換燃油、燃氣車,將不予上牌。九類新能源汽車購車補貼比例由1:0.5提高到1:1。  
推廣純電動計程車、新能源公車   明年起,河北省將啟動純電動計程車試點工作,張家口市、廊坊市作為首批純電動計程車試點市,各開展50-200輛的純電動計程車運營公司試點工作。逐步在全省範圍內推廣電動計程車。   河北省將統籌考慮用油、用氣、新能源公車一定期限內購置及運營成本,建立鼓勵新能源公車應用、限制燃油公車增長的新機制,調整現行燃油補貼政策,加大對新能源公車支持力度。2015年至2019年,我省新增及更換的公車中新能源公車比重將分別達到40%、50%、60%、70%、80%。  
加快充電設施建設   河北省將進一步加快充電設施建設,把充電站、充電樁建設納入城鄉建設規劃,按照統籌規劃、科學佈局、適度超前、有序建設的原則,加快推進住宅社區、單位內部、社會停車場等面向個人使用的充電設施建設,到2020年基本建成車樁相隨、智能高效的充電基礎設施體系。   河北省將在石家莊、張家口、邯鄲三市進行充電設施建設試點,整合企業、社會、政府等多方力量,在賓館飯店、商場超市、學校醫院、路邊車位、旅遊景點等公共場所,開展充電樁、充電樁群建設,形成規模效應。全省黨政機關、事業單位以及國有企業等也將積極建設充電樁,省直機關率先安裝,做出示範。   該消息是河北新聞網記者從11月27日召開的全省新能源汽車發展和推廣應用工作領導小組(擴大)會議上獲悉的。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

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

決策樹(上)-ID3、C4.5、CART

參考資料(要是對於本文的理解不夠透徹,必須將以下博客認知閱讀,方可全面了解決策樹):

1.

2.

3.

決策樹是一個非常常見並且優秀的機器學習算法,它易於理解、可解釋性強,其可作為分類算法,也可用於回歸模型。本文將分三篇介紹決策樹,第一篇介紹基本樹(包括 ID3、C4.5、CART),第二篇介紹 Random Forest、Adaboost、GBDT,第三篇介紹 Xgboost 和 LightGBM。

在進入正題之前,先讓我們了解一些有關信息論的知識!

信息論

1.信息熵

在決策樹算法中,熵是一個非常非常重要的概念。一件事發生的概率越小,我們說它所蘊含的信息量越大。比如:我們聽女人能懷孕不奇怪,如果某天聽到哪個男人懷孕了,我們就會覺得emmm…信息量很大了。

所以我們這樣衡量信息量:

 

 其中,P(y)是事件發生的概率。信息熵就是所有可能發生的事件的信息量的期望:

表達了Y事件發生的不確定度。

決策樹屬性劃分算法

眾所周知,決策樹學習的關鍵在於如何選擇最優劃分屬性,一般而言,隨着劃分過程不斷進行,我們希望決策樹的分支結點所包含的樣本盡可能屬於同一類別,即結點的“純度”越來越高。

1.ID3

(1)思想

從信息論的知識中我們知道:信息熵越大,從而樣本純度越低,。ID3 算法的核心思想就是以信息增益來度量特徵選擇,選擇信息增益最大的特徵進行分裂。算法採用自頂向下的貪婪搜索遍歷可能的決策樹空間(C4.5 也是貪婪搜索)。

(2)劃分標準(詳細過程以及公式推導見西瓜書即可)

ID3算法使用信息增益為準則來選擇劃分屬性,“信息熵”(information entropy)是度量樣本結合純度的常用指標,假定當前樣本集合D中第k類樣本所佔比例為pk,則樣本集合D的信息熵定義為:

假定通過屬性劃分樣本集D,產生了V個分支節點,v表示其中第v個分支節點,易知:分支節點包含的樣本數越多,表示該分支節點的影響力越大。故可以計算出劃分后相比原始數據集D獲得的“信息增益”(information gain)。

信息增益越大,表示使用該屬性劃分樣本集D的效果越好,因此ID3算法在遞歸過程中,每次選擇最大信息增益的屬性作為當前的劃分屬性。

(3)缺點

  • ID3 沒有剪枝策略,容易過擬合;
  • 信息增益準則對可取值數目較多的特徵有所偏好,類似“編號”的特徵其信息增益接近於 1;
  • 只能用於處理離散分佈的特徵;
  • 沒有考慮缺失值。

 

2. C4.5

2.1 思想

C4.5 算法最大的特點是克服了 ID3 對特徵數目的偏重這一缺點,引入信息增益率來作為分類標準。

C4.5 相對於 ID3 的缺點對應有以下改進方式:

  • 引入悲觀剪枝策略進行后剪枝;
  • 引入信息增益率作為劃分標準;
  • 可以處理連續值:將連續特徵離散化,假設 n 個樣本的連續特徵 A 有 m 個取值,C4.5 將其排序並取相鄰兩樣本值的平均數共 m-1 個劃分點,分別計算以該劃分點作為二元分類點時的信息增益,並選擇信息增益最大的點作為該連續特徵的二元離散分類點;
  • 可以處理缺失值:對於缺失值的處理可以分為兩個子問題:
  • 問題一:在特徵值缺失的情況下進行劃分特徵的選擇?(即如何計算特徵的信息增益率)
  • 問題二:選定該劃分特徵,對於缺失該特徵值的樣本如何處理?(即到底把這個樣本劃分到哪個結點里)
  • 針對問題一,C4.5 的做法是:對於具有缺失值特徵,用沒有缺失的樣本子集所佔比重來折算;
  • 針對問題二,C4.5 的做法是:將樣本同時劃分到所有子節點,不過要調整樣本的權重值,其實也就是以不同概率劃分到不同節點中。

2.2 劃分標準

利用信息增益率可以克服信息增益的缺點,其公式為:

 

注意:信息增益率對可取值較少的特徵有所偏好(分母越小,整體越大),因此 C4.5 並不是直接用增益率最大的特徵進行劃分,而是使用一個啟髮式方法:先從候選劃分特徵中找到信息增益高於平均值的特徵,再從中選擇增益率最高的。

2.3 剪枝策略(預剪枝+后剪枝)

決策樹解決過擬合的主要方法:剪枝、隨機森林

2.3.1 預剪枝

(1) 在決策樹生成過程中,對每個結點在劃分前先進行估計,若當前結點的劃分不能帶來決策樹泛化性能提升,則停止劃分並將當前結點標記為恭弘=叶 恭弘結點。在構造的過程中先評估,再考慮是否分支。衡量決策樹泛化性能提升的方法:

  • 節點內數據樣本低於某一閾值;
  • 所有節點特徵都已分裂;
  • 節點劃分前準確率比劃分后準確率高。

(2)優缺點

  • 降低過擬合風險、顯著減少決策樹的訓練時間開銷和測試時間開銷。
  • 預剪枝基於“貪心”策略,有可能會帶來欠擬合風險。
2.3.2 后剪枝(C4.5採用的是基於后剪枝的悲觀剪枝方法)

(1) 后剪枝是先從訓練集生成一棵完整的決策樹,然後自底向上地對非恭弘=叶 恭弘子結點進行考察,若將該結點對應的子樹替換為恭弘=叶 恭弘結點能帶來決策樹泛化性能提升,則將該子樹替換為恭弘=叶 恭弘結點。

(2) 后剪枝決策樹的欠擬合風險很小,泛化性能往往優於預剪枝決策樹。但同時其訓練時間會大的多。

2.4 缺點

  • 剪枝策略可以再優化;
  • C4.5 用的是多叉樹,用二叉樹效率更高;
  • C4.5 只能用於分類;
  • C4.5 使用的熵模型擁有大量耗時的對數運算,連續值還有排序運算;
  • C4.5 在構造樹的過程中,對數值屬性值需要按照其大小進行排序,從中選擇一個分割點,所以只適合於能夠駐留於內存的數據集,當訓練集大得無法在內存容納時,程序無法運行。

 

3. CRAT

ID3 和 C4.5 雖然在對訓練樣本集的學習中可以盡可能多地挖掘信息,但是其生成的決策樹分支、規模都比較大,CART 算法的二分法可以簡化決策樹的規模,提高生成決策樹的效率。

Cart算法的兩個主要步驟為:(1)將樣本遞歸劃分進行建樹過程 ; (2)用驗證數據進行剪枝.

3.1 思想

CART 在 C4.5 的基礎上進行了很多提升。

  • C4.5 為多叉樹,運算速度慢,CART 為二叉樹,運算速度快;
  • C4.5 只能分類,CART 既可以分類也可以回歸;
  • CART 使用 Gini 係數作為變量的不純度量,減少了大量的對數運算;
  • CART 採用代理測試來估計缺失值,而 C4.5 以不同概率劃分到不同節點中;
  • CART 採用“基於代價複雜度剪枝”方法進行剪枝,而 C4.5 採用悲觀剪枝方法。

3.2 劃分標準(Cart分類樹、Cart回歸樹)

首先我們來看看Cart分類樹!

CART決策樹(分類樹)使用“基尼指數”(Gini index)來選擇劃分屬性,基尼指數反映的是從樣本集D中隨機抽取兩個樣本,其類別標記不一致的概率,因此Gini(D)越小越好,這和信息增益(率)正好相反,基尼指數定義如下:

進而,使用屬性α劃分后的基尼指數為:

 

接下來讓我們通過一個實例,從實例中去了解如何創建一棵Cart分類樹。 如下圖所示

在上述圖中,共10條數據,屬性有3個,分別是有房情況(離散屬性且2種取值)婚姻狀況(離散屬性且有3種取值)年收入(連續屬性),拖欠貸款者屬於分類的結果。

對於離散屬性(2種取值與多種取值)連續屬性我們該如何進行Gini係數的計算以及劃分呢?

1.首先來看有房情況這個屬性,因為該屬性只有“是”“否”兩種取值,所以其Gini係數比較容易計算,那麼按照它劃分后的Gini指數計算如下:

 

 2.接下來對婚姻狀況進行計算,我們發現婚姻狀況一共有三種取值:單身、已婚、離異,又因為Cart分類樹只能是二叉樹,所以我們只能對多種取值的屬性進行組合:

 

 3.最後對年收入屬性進行計算。年收入屬性為連續值,Cart分類樹又是如何對連續值屬性進行處理的呢?(Cart分類樹對於連續值的處理其實和C4.5算法對於連續值的處理類似,只不過Cart使用Gini指數,C4.5使用信息增益率)

將連續特徵離散化,假設 n 個樣本的連續特徵 A 有 m 個取值,C4.5/Cart 將其排序並取相鄰兩樣本值的平均數共 m-1 個劃分點,分別計算以該劃分點作為二元分類點時的信息增益/Gini係數,並選擇信息增益最大/Gini係數最小的點作為該連續特徵的二元離散分類點;

通過計算我們可以發現,(單身或離異,已婚) 和 (<=97,>97)這種劃分其Gini係數最小(假設我們選擇年收入)。所以根節點分裂為兩個子節點,其中一個為恭弘=叶 恭弘子結點。對於另外一個結點我們繼續使用上述方法在婚姻狀況、有房情況中選擇最佳特徵以及最佳切分點,反覆循環直到滿足條件為止。

 接下來讓我們看看Cart回歸樹(最小二乘回歸樹)

眾所周知,決策樹學習的關鍵在於如何選擇最優劃分屬性,然而對於Cart回歸樹而言,還有一個重要的問題就是:如何決定樹中恭弘=叶 恭弘節點的輸出值?

回歸樹的模型可以表示如下:

上式中,  為對應恭弘=叶 恭弘子節點的輸出值,  為指示函數,當x屬於  時,值為1,否則為0。

回歸樹的建立過程,優化策略或損失函數為最小化平方誤差,即最小化下式:

 

(1)問題1:怎樣對輸入空間進行劃分?即如何選擇劃分點?

CART回歸樹的建樹過程是二分裂節點,並且保證分裂的結果符合最小化平方誤差,這裏採用了比較暴力的遍曆法,即遍歷所有特徵j和每個特徵的多個閾值s,以平方誤差最小的組合作為分裂依據,數學描述如下:

 
上式中,R為以s為分割點分割的左右子樹樣本合集,c為該集合的均值。

確定了j,s后,就可以就行分裂了,將樹分裂為左右兩個區域:

(2)問題2:如何決定樹中恭弘=叶 恭弘節點的輸出值?

分裂完畢以後,要確定每個恭弘=叶 恭弘子結點的輸出值,使用類別均值:

接下來讓我們通過一個實例,從實例中去了解如何創建一棵Cart回歸樹。 如下圖所示

3.3 剪枝策略(簡略版本,具體推導見李航 統計學習方法)

採用一種“基於代價複雜度的剪枝”方法進行后剪枝,這種方法會生成一系列樹,每個樹都是通過將前面的樹的某個或某些子樹替換成一個恭弘=叶 恭弘節點而得到的,這一系列樹中的最後一棵樹僅含一個用來預測類別的恭弘=叶 恭弘節點。然後用一種成本複雜度的度量準則來判斷哪棵子樹應該被一個預測類別值的恭弘=叶 恭弘節點所代替。這種方法需要使用一個單獨的測試數據集來評估所有的樹,根據它們在測試數據集熵的分類性能選出最佳的樹。

3.4類別不平衡

CART 的一大優勢在於:無論訓練數據集有多失衡,它都可以將其消除不需要建模人員採取其他操作。

CART 使用了一種先驗機制,其作用相當於對類別進行加權。這種先驗機制嵌入於 CART 算法判斷分裂優劣的運算里,在 CART 默認的分類模式中,總是要計算每個節點關於根節點的類別頻率的比值,這就相當於對數據自動重加權,對類別進行均衡。

4.總結

最後通過總結的方式對比下 ID3、C4.5 和 CART 三者之間的差異。

除了之前列出來的劃分標準、剪枝策略、連續值確實值處理方式等之外,我再介紹一些其他差異:

  • 劃分標準的差異:ID3 使用信息增益偏向特徵值多的特徵,C4.5 使用信息增益率克服信息增益的缺點,偏向於特徵值小的特徵,CART 使用基尼指數克服 C4.5 需要求 log 的巨大計算量,偏向於特徵值較多的特徵。
  • 使用場景的差異:ID3 和 C4.5 都只能用於分類問題,CART 可以用於分類和回歸問題;ID3 和 C4.5 是多叉樹,速度較慢,CART 是二叉樹,計算速度很快;
  • 樣本數據的差異:ID3 只能處理離散數據且缺失值敏感,C4.5 和 CART 可以處理連續性數據且有多種方式處理缺失值;從樣本量考慮的話,小樣本建議 C4.5、大樣本建議 CART。C4.5 處理過程中需對數據集進行多次掃描排序,處理成本耗時較高,而 CART 本身是一種大樣本的統計方法,小樣本處理下泛化誤差較大 ;
  • 樣本特徵的差異:ID3 和 C4.5 層級之間只使用一次特徵,CART 可多次重複使用特徵;
  • 剪枝策略的差異:ID3 沒有剪枝策略,C4.5 是通過悲觀剪枝策略來修正樹的準確性,而 CART 是通過代價複雜度剪枝

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

※帶您來了解什麼是 USB CONNECTOR  ?

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

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

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

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

使用Samba服務實現文件共享

1.在虛擬機上安裝Samba服務安裝包 (在下載之前檢查客戶機與服務器是否能夠ping通)(Samba服務的主要端口號為137 138 139  445)

(鼠標右擊桌面,打開終端,測試和yum是否能夠ping通,下面的命令行是我的yum的IP地址)

[root@huming_hbza ~]#ping 192.168.26.10

然後輸入命令行:(安裝Samba服務安裝包)

[root@huming_hbza ~]#yum install samba

執行結果如下圖:

 

如下圖顯示錶明安裝成功:

2.修改配置文件

在這裏提醒讀者的是:修改配置文件之前,我們可以養成良好的習慣將原始的配置文件備份下來

具體執行命令行如下:

[root@huming_hbza ~]#cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

執行如下圖所示:

接下來讓我們進入到Samba文件中修改Samba的配置文件,此時需要記住的是smb.conf 文件是Samba的配置文件

命令行:

[root@huming_hbza ~]#cd /etc/samba
[root@huming_hbza ~]#vim smb.conf

敲回車之後就會彈出如下圖所示的界面:

[global]
    workgroup = workgroup                   //工作組名稱
    server string = Samba Server %v         //服務器介紹信息,參數%v為显示SMB版本號
    security = user                                //安全驗證的方式
    map to guest = bad user                  
    dns proxy = no
[anonymous]                                           //共享名稱為anonymous
    comment = This is a dirctory of anonymous.       //警告用戶的內容
    path = /samba/anonymous                               //共享文件夾所在的位置
    browseable = yes                                             
    writeable = yes                                   //允許寫入操作      
    guest ok = yes                                   //是否所有人可見,等同於“public參數”
    read only = no

將上圖中的配置文件改成如下圖所示:(注:anonymous部分是需要自己添加進去的,而global部分是需要在原來的基礎上進行更改)

保存退出

 

創建共享目錄anonymous,進入到該目錄下並在anonymous文件中創建一個1.txt文件,並且開啟smb和nmb服務以及將這兩個服務設置為開機自啟動 ,具體命令行操作如下:

[root@huming_hbza ~]#mkdir -p /samba/anonymous
[root@huming_hbza ~]#cd /samba/anonymous
[root@huming_hbza ~]#echo "deyaugyua123456789" > 1.txt    //在anonymous文件中創建一個1.txt
[root@huming_hbza ~]#systemctl start smb.service
[root@huming_hbza ~]#systenctl start nmb.service
[root@huming_hbza ~]#systemctl enable smb.service //設置為開機自啟動
[root@huming_hbza ~]#systemctl enable nmb.service //設置為開機自啟動

操作如下圖示:

 

 接下來可以在自己的主機上打開我的電腦輸入:

\\192.168.26.100(自己建立的Samba服務的客戶機的地址 )

 

 注:自己的主機一定要和客戶機ping通否則會出現如下圖提示:

 

 然後輸入CentOS系統的賬戶和密碼就是登陸憑證,進去之後就是如下界面:(在CentOS系統中創立的文件)

 

 

然後點擊打開右擊之後發現是可以複製的,即也可以拖拽複製到自己的主機上如下圖显示,但是這裏提醒一下讀者,因為在配置smb.conf文件的權限時候沒有加上寫權限是關閉的,即在自己主機上是不可以保存以及上傳文件的,只可以下載文件,如果有需要可以再去更改一下配置文件,

 

 

 

 

 

 

如果更改文件保存的話會出現如下圖的提示:

 

 

Samba服務的操作就介紹到這裏了,多數我們使用是為了從服務器下載文件比較方便才進行的,感興趣的小夥伴趕緊跟着教程去試試吧

 

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

webpack 打包優化的四種方法(多進程打包,多進程壓縮,資源 CDN,動態 polyfill)

如今,webpack 毫無疑問是前端構建領域里最耀眼的一顆星,無論你前端走哪條路線,都需要有很強的webpack 知識。webpack 的基本用法這裏就不展開講了。主要探討一下如何提高 webpack 的打包速度。

這篇文章以 vue cli3.0+webpack4.0+nodejs10.0+ 這幾個版本為例。

一、打包分析

1.1、速度分析

我們的目的是優化打包速度,那肯定需要一個速度分析插件,此時 speed-measure-webpack-plugin 就派上用場了。它的作用如下:

  • 分析整個打包總耗時
  • 每個 pluginloader 的耗時情況

首先,安裝插件

npm i -D speed-measure-webpack-plugin

然後修改 vue.config.js 配置文件 (vuecli3+ 版本的配置文件統一在這個文件里修改,如果沒有該文件,在根目錄新建一個)

// 導入速度分析插件
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");

// 實例化插件
const smp = new SpeedMeasurePlugin();

module.exports = {
    configureWebpack: smp.wrap({
        plugins: [
            // 這裡是自己項目里需要使用到的其他插件
            new yourOtherPlugin()
        ]
    })
}

運行打包命令之後,可以看到,打包總耗時為 2min,51.99s

1.2、體積分析

分析完打包速度之後,接着我們來分析打包之後每個文件以及每個模塊對應的體積大小。使用到的插件為 webpack-bundle-analyzer,構建完成後會在 8888 端口展示大小。

首先,安裝插件

npm i -D webpack-bundle-analyzer

修改 vue.config.js 配置文件

// 導入速度分析插件
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");

// 導入體積分析插件
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;

// 實例化速度分析插件
const smp = new SpeedMeasurePlugin();

module.exports = {
    configureWebpack: smp.wrap({
        plugins: [
            // 實例化體積分析插件
            new BundleAnalyzerPlugin()
        ]
    })
}

構建之後可以看到,其中黃色塊 chunk-vendors 文件佔比最大,為 1.34MB

二、打包優化

2.1、多進程多實例構建,資源并行解析

多進程構建的方案比較知名的有以下三個:

  • thread-loader (推薦使用這個)
  • parallel-webpack
  • HappyPack

這裏以 thread-loader 為例配置多進程多實例構建
安裝 loader

npm i -D thread-loader

接下來在 vue.config.js 配置文件中使用該 loader

// 導入速度分析插件
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");

// 實例化插件
const smp = new SpeedMeasurePlugin();
module.exports = {
    configureWebpack: smp.wrap({
        module: {
            rules: [
                {
                    test: /\.js$/,
                    use: ['thread-loader']
                }
            ]
        }
    })
}

然後看下構建花費的時間, 2min,49.21s,相較於之前提升了 5s

2.2、公用代碼提取,使用 CDN 加載

對於vue,vuex,vue-router,axios,echarts,swiper等我們可以利用webpack的externals參數來配置,這裏我們設定只需要在生產環境中才需要使用。
下面配置 vue.config.js

// 導入速度分析插件
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");

// 導入體積分析插件
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;

//判斷是否為生產環境
const isProduction = process.env.NODE_ENV === 'production';

//定義 CDN 路徑,這裏採用 bootstrap 的 cdn
const cdn = {
    css: [
        'https://cdn.bootcss.com/Swiper/4.5.1/css/swiper.min.css'
    ],
    js: [
        'https://cdn.bootcss.com/vue/2.6.10/vue.min.js',
        'https://cdn.bootcss.com/vue-router/3.1.3/vue-router.min.js',
        'https://cdn.bootcss.com/vuex/3.1.1/vuex.min.js',
        'https://cdn.bootcss.com/axios/0.19.0/axios.min.js',
        'https://cdn.bootcss.com/echarts/4.3.0/echarts.min.js',
        'https://cdn.bootcss.com/Swiper/4.5.1/js/swiper.min.js',
    ]
}

// 實例化插件
const smp = new SpeedMeasurePlugin();
module.exports = {
    chainWebpack: config => {
        // 生產環境配置
        if (isProduction) {
            // 生產環境注入 cdn
            config.plugin('html')
                .tap(args => {
                    args[0].cdn = cdn;
                    return args;
                });
        }
    },
    configureWebpack: smp.wrap({
        module: {
            rules: [
                {
                    test: /\.js$/,
                    use: ['thread-loader']
                }
            ]
        },
        plugins: [
            new BundleAnalyzerPlugin()
        ],
        //生產環境注入 cdn
        externals: isProduction && {
            'vue': 'Vue',
            'vuex': 'Vuex',
            'vue-router': 'VueRouter',
            'axios': 'axios',
            'echarts': 'echarts',
            'swiper': 'Swiper'
        } || {}
    })
}

緊接着,改造 html 頁面。用於讓我們配置的 cdn 路徑注入到 html 頁面

<!DOCTYPE html>
<html lang="zh">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <!-- 使用 CDN 的 CSS 文件 -->
  <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>
    <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="stylesheet">
  <% } %>
</head>

<body>
  <noscript>
    <strong>We're sorry but eye-admin doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
  </noscript>
  <div id="app"></div>
  <!-- built files will be auto injected -->

 <!-- 使用 CDN 的 JS 文件 -->
  <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
    <script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
  <% } %>
</body>

</html>

最重要的一步,看下效果,可以看到現在耗時 1min,39.19s,整整提升了 1 分多鍾!

2.3、多進程多實例并行壓縮

并行壓縮主流有以下三種方案

  • 使用 parallel-uglify-plugin 插件
  • uglifyjs-webpack-plugin 開啟 parallel 參數
  • terser-webpack-plugin 開啟 parallel 參數 (推薦使用這個,支持 ES6 語法壓縮)

安裝插件依賴

npm i -D terser-webpack-plugin

接下來在 vue.config.js 配置文件中使用插件,最終的配置文件如下

// 導入速度分析插件
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");

// 導入代碼壓縮插件
const TerserPlugin = require("terser-webpack-plugin");

// 導入體積分析插件
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;

//判斷是否為生產環境
const isProduction = process.env.NODE_ENV === 'production';

//定義 CDN 路徑,這裏採用 bootstrap 的 cdn
const cdn = {
    css: [
        'https://cdn.bootcss.com/Swiper/4.5.1/css/swiper.min.css'
    ],
    js: [
        'https://cdn.bootcss.com/vue/2.6.10/vue.min.js',
        'https://cdn.bootcss.com/vue-router/3.1.3/vue-router.min.js',
        'https://cdn.bootcss.com/vuex/3.1.1/vuex.min.js',
        'https://cdn.bootcss.com/axios/0.19.0/axios.min.js',
        'https://cdn.bootcss.com/echarts/4.3.0/echarts.min.js',
        'https://cdn.bootcss.com/Swiper/4.5.1/js/swiper.min.js',
    ]
}

// 實例化插件
const smp = new SpeedMeasurePlugin();
module.exports = {
    chainWebpack: config => {
        // 生產環境配置
        if (isProduction) {
            // 生產環境注入 cdn
            config.plugin('html')
                .tap(args => {
                    args[0].cdn = cdn;
                    return args;
                });
        }
    },
    configureWebpack: smp.wrap({
        module: {
            rules: [
                {
                    test: /\.js$/,
                    use: ['thread-loader']
                }
            ]
        },
        plugins: [
            new BundleAnalyzerPlugin()
        ],
        //生產環境注入 cdn
        externals: isProduction && {
            'vue': 'Vue',
            'vuex': 'Vuex',
            'vue-router': 'VueRouter',
            'axios': 'axios',
            'echarts': 'echarts',
            'swiper': 'Swiper'
        } || {},
        optimization: {
            minimizer: [
                new TerserPlugin({
                    parallel: 4
                })
            ]
        }
    })
}

2.4、使用 polyfill 動態服務

動態 polyfill 指的是根據不同的瀏覽器,動態載入需要的 polyfillPolyfill.io 通過嘗試使用 polyfill 重新創建缺少的功能,可以更輕鬆地支持不同的瀏覽器,並且可以大幅度的減少構建體積。

Polyfill Service 原理

識別 User Agent,下發不同的 Polyfill

使用方法:在 index.html 中引入如下 script 標籤

<script crossorigin="anonymous" src=""></script>

三、完結

At last,看完之後有什麼不懂的,可以留言反饋。

轉載請註明出處:
作者:TSY
個人空間:

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

【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

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