部落格

  • 英國計畫開發可以同時照明和給電動汽車充電的街燈

    英國政府日前給倫敦市劃撥了4000萬英鎊資金,供其開發可以同時照明和給電動汽車充電的街燈。

    現在尚不清楚這種街燈將會是什麼樣子的,也不清楚它們將於何時推出。

    寶馬公司也在努力競標成為這個項目的贊助商。但是,倫敦的這個街燈項目尚未宣佈任何具體計畫。

    倫敦還斥資1300萬英鎊啟動了“未來鄉鄰”(neighborhoodsofthefuture)計畫。該計畫旨在給電動汽車司機提供免費的停車位以及交通優先權,例如可以使用公共汽車道,以鼓勵更多的人購買這種更環保的汽車。

    此外,倫敦當局證實,到2020年,該市將會出現3000輛混合動力巴士和300輛零排放單層巴士;而且,該市將會撥款60萬英鎊,讓倫敦的消防隊全部配備電動汽車。

    英國總共挑選了4個城市做試點,給它們分別撥款數百萬英鎊讓其推行電動汽車。其中布里斯托爾市還推出了一項為期四周的先試駕再購買的活動,以促使對電動汽車有興趣的人進行購買。

    英國還劃撥了500萬英鎊研發資金,用於開發其他相關專案。例如,約克市的蓋有太陽頂棚的“停放小轎車換乘公共汽車進城”(parkandride)中心。它的設計就是為了減少空氣污染。

    英國還有一個6000萬英鎊的專案,該專案包括有一個名為goultralowcities的基金。該基金旨在支持電動汽車、投資低排放公共交通以及研發超長續航能力的電池。

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

    【其他文章推薦】

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

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

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

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

  • 特斯拉遭知名放空機構盯上!供需恐出包、股價下挫

    特斯拉遭知名放空機構盯上!供需恐出包、股價下挫

    知名放空機構香櫞研究(Citron Research)去(2015)年10月狙擊加拿大專業製藥公司Valeant Pharmaceuticals International Inc.、質疑該公司認列的藥品收入,導致其股價在一天內慘跌19%後,又在去年12月16日將「2016年年度放空標的」頭銜頒給以色列先進駕駛輔助系統(Advanced Driver Assistance Systems;ADAS)大廠Mobileye N.V.,使其股價一路滾落了42%。   現在,Citron把炮口轉向美國豪華電動車製造商特斯拉(Tesla Motors, Inc.),週二(3月1日)透過Twitter聲稱特斯拉供需出狀況、將使其股價在今年底下探100美元。Citron還指出,消息面看來對股價相當不利。   特斯拉1日聞訊逆勢下挫2.91%、收186.35美元。特斯拉預定3月31日首度公開專為大眾設計的次世代電動車「Model 3」。   其實,在特斯拉於2月中公布第4季財報前,Model X休旅車的產能問題、低油價恐衝擊電動車銷售量等疑慮,就不斷壓抑公司股價。   不過,當特斯拉維持2016年強勁的銷售預估不變、還聲稱會在2017年發售Model 3之後,股價就應聲反彈。   特斯拉執行長Elon Musk更對自家公司展現信心。洛杉磯時報、Forbes報導,Musk已在1月29日執行選擇權,斥資350萬美元購入總值1億美元的特斯拉股票(當時其股價還有191.20美元)。   Citron最近雖因準確看空Valeant、Mobileye而受到矚目,但其實據華爾街日報報導,該機構2013年對特斯拉的空方評價卻成效不彰,特斯拉2013年迄今股價仍上漲了37%。   Citron、Musk這次誰勝誰負,還得看特斯拉能否順利拉高Model X與Model S的產能,而在內華達州占地1,000萬平方英尺的電池廠房也需如期完工,才能生產較為平價的大眾車款Model 3。   (本文內容由授權使用;首圖來源: CC BY 2.0)

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

    【其他文章推薦】

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

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

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

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

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

  • 德國總理許諾為汽車製造商掃除法律障礙 推動無人車、電動車研發

    德國總理安格拉•默克爾稱,自動駕駛汽車很快便能在德國進行上路測試,許諾為汽車製造商們掃除法律障礙。

    德國擁有全球最大的幾家汽車製造商。安格拉•默克爾表示,德國汽車行業應該起草一份請願書提交柏林,以加快無人駕駛汽車的研發與推出,請願書中最好附上時間規劃。

    目前,全球的汽車製造商都在致力於研發自動駕駛汽車,然而其原型至少將在2020年才能獲得推出。安格拉•默克爾12日在柏林的一次工業活動中透露,德國政府機關將於5月底舉行會議,討論下一步工作計畫,如若待辦事項均已完成,內閣便可開始推進車輛測試相關法律依據的制定工作。她告知戴姆勒集團CEO蔡澈(Dieter Zetsche)等稱,“這一話題在政府內部並不存在爭議。”

    德國政府還考慮支持電動車的研發工作,拉動消費者需求。然而德國內政部長朔伊布勒(Wolfgang Schaeuble)上月表示,政府機關會設法支援電動車研發,但可能無法滿足汽車製造商們的所有願望。

    德國工業領袖已經向政府施壓,要求推出激勵措施拉動電動車需求增長,並稱如果德國想要保持在汽車製造行業領先,那麼推出激勵措施是必需的。

    社會民主黨資深議員Hubertus Heil則對此表示,執政聯盟將在本週三的會議上就相關問題達成一致,“我相信我們能夠說服朔伊布勒。”

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

    【其他文章推薦】

    台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

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

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

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

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

  • 8 縣市 2020 年電動機車補助出爐,新購補助減少、汰舊換新成主力

    8 縣市 2020 年電動機車補助出爐,新購補助減少、汰舊換新成主力

    2020 年 1 月邁向尾聲,各縣市的電動機車補助也陸續出爐,至過年前已有 8 個縣市公布新購電動機車或汰舊換新補助的辦法。

    由於環保署補助在 2020 年退場,因此 2019 年底掀起一股電動機車的購車熱潮。2020 年後環保署政策改變,主力放在淘汰舊型機車減少空氣污染排放。因此雖然沒了新購電動機車補助,但汰舊換新的範圍擴大,2007 年 6 月 30 日前生產的一至四行程老舊燃油機車汰換成電動機車或 7 期燃油機車都能享有補助,重型機車每輛 5,000 元,輕型機車每輛 3,000 元。

    除了環保署政策改變,工業局購買電動機車的補助也下滑,從原先的每輛補助 1 萬元減少至 7,000 元,也是唯一全國適用的新購電動機車補助。因此 2020 年中央政府補助新購電動機車每輛 7,000 元,汰舊換新購買重型電動機車每輛共 12,000 元,汰舊換新購買輕型電動機車每輛共 1 萬元。

    截至 1 月 22 日有 8 個縣市公布電動機車補助額。

    地方政府部分,目前補助公布的縣市包括台北市、台中市、嘉義市、台南市、屏東縣、花蓮縣、台東縣和彰化縣。台北市和屏東縣等縣市跟隨環保署方向,停止補助新購電動機車,但繼續提供汰舊換新補助。彰化縣則是僅公佈汰舊換新補助辦法,尚未宣告新購電動機車補助措施。

    花蓮縣和台東縣補助金額最高但仰賴花東基金,有補助數量限制,每輛電動機車補助 1 萬元,花蓮縣政府僅於汰舊換新補助微幅加碼。花東以外,以嘉義市的補助金額最高,新購電動機車補助 8,000 元,汰舊換新補助更高達 1 萬元。

    有些人認為 2020 年補助減少,電動機車銷量將大幅衰退。電動機車大廠 Gogoro 指出,由於汰購換新補助帶動換車潮,1 月上半銷售量已達 2019 年同期近 80%。不過這樣的觀察僅為少量樣本,電動機車能否維持 2019 年的強勢表現,值得持續關注。

    (合作媒體:。首圖來源:Gogoro)

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

    【其他文章推薦】

    ※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

    ※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

    ※Google地圖已可更新顯示潭子電動車充電站設置地點!!

    ※帶您來看台北網站建置台北網頁設計,各種案例分享

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

  • Nissan、BMW聯手 在美安裝更多電動車充電樁

    Nissan、BMW聯手 在美安裝更多電動車充電樁

    Nissan與BMW宣布,為共同強化各自旗下的電動車產品Nissan LEAF與BMW i3的客戶服務網,將合作在全美19州、共120處安裝雙頭快速充電樁。此舉未來可望刺激美國市場的電動車銷售量,並幫助電動車車主享有更便捷、廣泛的服務。

    Nissan LEAF是目前全球總銷量最好的電動車款之一,充電樁設備分布在社區、企業公司以及Nissan的經銷門市。與BMW的合作,將可加速提升充電樁設備的數量,強化用戶使用經驗同時開拓市場。

    BMW的北美電子移動經理Cliff Fietzek強調,與Nissan的合作還包含遠程行車的服務。一但電動車能提供更遠程的行駛距離,使用者就更能體驗電子移動科技的便利之處。

    這項合作將以Nissan的充電樁技術與BMW的DC快充技術為基礎,每座快充充電樁都有CHAdeMO與SAE Combo雙街頭,輸出功率50kW,可適用於Nissan LEAF與BMW i3兩種車款以及其他擁有快充埠的電動車。50kW的快充設備可在20-30分鐘之內將Nissan LEAF或BMW i3的電池充到80%左右,比目前最常見的Level 2 240V 充電服務的效率更好。

    Nissan與BMW的電動車充電樁服務範圍包括:加州、康乃迪克州、佛羅里達、喬治亞州、伊利諾州、印第安納州、馬里蘭州、明尼蘇達州、密蘇里州、新墨西哥州、內華達州、紐約、南北卡羅萊納州、俄亥俄州、賓州、田納西州、維吉尼亞州以及威斯康辛州。只要透過BWM i3的ConnectedDrive軟體,或者Nissan EZ-Charge智慧型手機app,就能快速找到充電站位置,電費可用Nissan EZ-Charge卡片結帳。

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

    【其他文章推薦】

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

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

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

    南投搬家前需注意的眉眉角角,別等搬了再說!

    新北清潔公司,居家、辦公、裝潢細清專業服務

  • 廣汽三菱收購進口三菱 或著重發展新能源汽車

    日前,從廣汽三菱汽車有限公司瞭解到,該公司已經完成對三菱汽車銷售有限公司的100%股份的收購。值得關注的是完成收購後的廣汽三菱下一步的汽車整體佈局。

    廣汽三菱汽車有限公司副總經理、三菱汽車銷售有限公司董事長杜志堅對外透露了廣汽三菱的新能源汽車發展的幾個方向。

    首先,基於三菱的插電式混合動力的優勢,廣汽三菱首推插電式混動車。據杜志堅描述這款新車的三個優勢,第一,這款車充滿電、加滿油,續航里程超過800公里,根本不用擔心去哪裡回不來;第二,燃油經濟性,百公里油耗不超過2L;第三,解決了對充電樁的依賴,只要提供一個插座,車隨時可以充電。

    其次,廣汽三菱的首款國產新能源汽車將基於插電式混合動力汽車歐藍德研發。據瞭解,目前廣汽三菱已經進口了10輛歐藍德,正處於廠商進行驗證測試階段。這款車的儘快導入,應該說對整個廣汽三菱產品線的提升、科技感提升、品牌提升都將有巨大的幫助。
     

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

    【其他文章推薦】

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

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

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

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

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

  • FastDFS圖片服務器單機安裝步驟(修訂版)

    FastDFS圖片服務器單機安裝步驟(修訂版)

    前面已經講 ,通過此文章可以了解FastDFS組件中單機安裝流程。

    單機版架構圖

    以下為單機FastDFS安裝步驟

    一、環境準備

    CentOS 7.X

    使用的版本: libfastcommon-1.0.41.tar.gz

    使用的版本: fastdfs-6.01.tar.gz

    使用的版本:fastdfs-nginx-module-1.21.tar.gz

    使用的版本: nginx-1.16.1.tar.gz

    二、安裝過程

    1、安裝 libfastcommon-1.0.41.tar.gz

    tar -zxvf libfastcommon-1.0.41.tar.gz
    cd libfastcommon-1.0.41/
    ./make.sh
    ./make.sh install

    2、安裝 FastDFS

    tar -zxvf  fastdfs-6.01.tar.gz
    cd fastdfs-6.01/
    ./make.sh
    ./make.sh install

    準備配置文件

    cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
    cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
    cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
    cd /opt/apps/fastdfs-6.01/conf
    cp http.conf mime.types /etc/fdfs/

    Tracker Server 配置

    vim /etc/fdfs/tracker.conf
    修改配置如下:
    #tracker server端口號
    port=22122
    #存儲日誌和數據的根目錄
    base_path=/opt/fastdfs/tracker
    #HTTP服務端口
    http.server_port=80
    開放防火牆端口

    1、打開跟蹤端口

    vim /etc/sysconfig/iptables

    2、添加以下端口行:

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT

    3、重啟防火牆

    service iptables restart
    啟動Tracker
    /etc/init.d/fdfs_trackerd start

    Storage Server 配置

    vim /etc/fdfs/storage.conf
    修改配置如下:
    #storage server端口號
    port=23000
    #數據和日誌文件存儲根目錄
    base_path=/opt/fastdfs/storage
    #第一個存儲目錄
    store_path0=/opt/fastdfs/storepath0
    #tracker服務器IP和端口
    tracker_server=192.168.0.1:22122
    #http訪問文件的端口(默認8888,看情況修改,和nginx中保持一致)
    http.server_port=8888
    開放防火牆端口

    1、打開跟蹤端口

    vim /etc/sysconfig/iptables

    2、添加以下端口行:

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT

    3、重啟防火牆

    service iptables restart
    啟動Storage
    /etc/init.d/fdfs_storaged start
    查看集群狀態
     fdfs_monitor /etc/fdfs/storage.conf list
    

    查看狀態是否正常

    Storage 1:
    id = 6.0.36.243
    ip_addr = 6.0.36.243 (anantes-651-1-49-net.w2-0.abo.wanadoo.fr) ACTIVE

    Client配置

    vim /etc/fdfs/client.conf
    
    修改配置如下:
    #
    base_path=/opt/apps/fastdfs/client
    #tracker服務器IP和端口
    tracker_server=192.168.0.1:22122 
    
    上傳一個圖片測試是否能上傳成功
     fdfs_upload_file /etc/fdfs/client.conf test.jpg
    

    test.jpg 是測試本地上傳的圖片,路徑請填寫正確

    3、安裝Nginx和 fastdfs-nginx-module

    #解壓fastdfs-nginx-module
    tar -zxvf fastdfs-nginx-module-1.21.tar.gz
    cd fastdfs-nginx-module-1.21/
    cp ./src/mod_fastdfs.conf /etc/fdfs
    #解壓nginx
    tar -zxvf nginx-1.16.1.tar.gz
    cd nginx-1.16.1/
    #安裝nginx_http_image_filter_module
    yum -y install gd-devel
    yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel
    #添加模塊
    ./configure --add-module=../fastdfs-nginx-module-1.21/src --prefix=/usr/local/nginx --with-http_image_filter_module 
    #編譯nginx
    make
    #安裝nginx
    make install
    

    查看是否安裝成功

    /usr/local/nginx/sbin/nginx -V
    

    查看插件是否安裝成功

    [root@FastDFS nginx-1.16.1]# /usr/local/nginx/sbin/nginx -V
    nginx version: nginx/1.16.1
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) 
    configure arguments: --add-module=../fastdfs-nginx-module-1.21/src --prefix=/usr/local/nginx --with-http_image_filter_module
    [root@FastDFS nginx-1.16.1]# 
    

    修改Nginx訪問

    vim /etc/fdfs/mod_fastdfs.conf

    修改配置如下:

    #
    connect_timeout=10
    #tracker服務器IP和端口
    tracker_server=192.168.0.1:22122
    #是否啟用group組名
    url_have_group_name=true
    #
    store_path0=/opt/fastdfs/storepath0

    修改Nginx配置:

    vim /usr/local/nginx/conf/nginx.conf
    

    修改配置如下:

    server {
        listen       80;
        server_name  localhost;
    
        #charset koi8-r;
    
        #access_log  logs/host.access.log  main;
    
        location / {
            root   html;
            index  index.html index.htm;
        }
        #圖片帶壓縮訪問
        location ~ /group1/M00/(.*)\.(jpg|gif|png)!format=([0-9]+)_([0-9]+) {
            alias  /home/fastdfs/storage/data/;
            ngx_fastdfs_module;
            set $w $3;
            set $h $4;
    
            rewrite group1/M00(.+)\.(jpg|gif|png)!format=([0-9]+)_([0-9]+)$ group1/M00$1.$2 break;
    
            image_filter resize $w $h;
            image_filter_buffer 5M;
        }
        #主圖訪問
        location ~ /group([0-9])/M00/(.+)\.?(.+) {
            alias /home/fastdfs/storage/data/;
            ngx_fastdfs_module;
        }
    ...
    }
    

    啟動Nginx

    #啟動
    /usr/local/nginx/sbin/nginx
    #停止
    /usr/local/nginx/sbin/nginx -s stop
    #重啟
    /usr/local/nginx/sbin/nginx -s reload

    通過以上配置完成FastDFS的搭建。

    測試圖片訪問

    圖片訪問示例:

    主圖訪問

    http://218.2.204.124:30308/group1/M00/00/03/BgAk813IvTCAIxxxAAD44NFKFPc908.png

    壓縮圖片 (主圖后加 !format=寬度_高度)訪問

    http://218.2.204.124:30308/group1/M00/00/03/BgAk813IvTCAIxxxAAD44NFKFPc908.png!format=400_10

    未解決的問題

    壓縮圖片使用主圖后?format=寬度_高度

    本文由博客一文多發平台 發布!

    再次感謝!!! 您已看完全文,歡迎關注微信公眾號猿碼 ,你的支持是我持續更新文章的動力!

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

    【其他文章推薦】

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

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

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

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

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

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

  • 基於 HTML5 + WebGL 實現 3D 挖掘機系統

    基於 HTML5 + WebGL 實現 3D 挖掘機系統

    前言

    在工業互聯網以及物聯網的影響下,人們對於机械的管理,机械的可視化,机械的操作可視化提出了更高的要求。如何在一個系統中完整的显示机械的運行情況,机械的運行軌跡,或者机械的机械動作顯得尤為的重要,因為這會幫助一個不了解這個机械的小白可以直觀的了解机械的運行情況,以及机械的所有可能發生的動作,對於三一或者其它國內國外重工机械的公司能夠有一個更好的展示或者推廣。
    挖掘機,又稱挖掘机械(excavating machinery),從近幾年工程机械的發展來看,挖掘機的發展相對較快,挖掘機已經成為工程建設中最主要的工程机械之一。所以該系統實現了對挖掘機的 3D 可視化,在傳統行業一般都是基於 Web SCADA 的前端技術來實現 2D 可視化監控,而且都是 2D 面板部分數據的監控,從後台獲取數據前台显示數據,但是對於挖掘機本身來說,挖掘機的模型,挖掘機的動作,挖掘機的運行可視化卻是更讓人眼前一亮的,所以該系統對於挖機的 3D 模型做出了動作的可視化,大體包括以下幾個方面:

    • 前進後退 — 用戶可以通過鍵盤 wasd 實現前後左右,或者點擊 2D 界面 WASD 來實現挖機的前進後退。
    • 機身旋轉 — 用戶可以通過鍵盤左右鍵實現機身的旋轉,或者點擊 2D 界面 < > 來實現挖機機身的旋轉。
    • 大臂旋轉 — 用戶可點擊 2D 界面第一個滑塊部分實現大臂的旋轉。
    • 小臂旋轉 — 用戶可點擊 2D 界面第二個滑塊部分實現小臂的旋轉。
    • 挖斗挖掘 — 用戶可點擊 2D 界面第三個滑塊部分實現挖斗部分的旋轉挖掘。
    • 挖機動畫 — 用戶可點擊 2D 界面鏟子圖標,點擊之後系統會把挖機本身幾個動畫做一個串聯展示。

    本篇文章通過對挖掘機可視化場景的搭建,挖機机械動作代碼的實現進行闡述,幫助我們了解如何使用  實現一個挖掘機的可視化。

    預覽地址: 

    界面效果預覽

    挖機机械運動效果

    通過上面 gif 圖片可以看出挖掘機的幾個主要動作。

    挖機挖斗運動效果

    滑動頁面的第三個滑桿控制挖斗的旋轉挖掘。

    挖機機身運動

    通過上面 gif 圖片可以看出挖掘機的前進後退以及機身旋轉幾個運動。

    場景搭建

    該 3D 場景中所有形狀都是用 HT 內部的牆面工具進行構建,通過設置牆面透明屬性 shape3d.transparent 為 true 以及對構建出的牆面進行貼圖來構造出場景中的類似建築的显示效果,具體的樣式可以參考 HT 的 ,場景效果:

    通過上圖我們可以看到場景中有許許多多的牆面建築,所以它們有許多相同的地方,例如樣式以及貼圖都是一樣的,所以在 HT 中可以通過批量的操作對這些牆面進行處理,批量的意思指的是在當前未處理的情況下的牆面圖元是一個個獨立繪製的模型,所以性能會比較差,而當一批圖元聚合成一個大模型進行一次性的繪製時,則會極大提高 WebGL 刷新性能,這就是批量所以要做的事情,具體可以參考 HT 的 

    該系統 2d 面板部分則也是通過 HT 的矢量進行繪製,面板部分主要包括當前挖機的作業情況,工作時間,保修信息,故障信息等,通過二維的方式展示這些數據信息,面板截圖:

    机械運動代碼分析

    該系統中挖機的動作是十分的重要和關鍵的,大小臂運動時液壓杠該如何運動,挖斗運動時液壓桿,旋轉點零件,以及連接到挖鬥上的零部件如何聯動起來是關鍵點,机械動畫中用到大部分數學知識進行點面位置的計算,以下是幾個關鍵的數學知識點作為基礎:

    在數學中,向量(也稱為幾何向量、矢量),指具有大小和方向的量。它可以形象化地表示為帶箭頭的線段。系統中會通過向量的叉乘算出與某個面垂直的向量即法向量,在計算挖斗旋轉時需要計算出與挖斗面垂直的法向量來進行點的計算,HT 中封裝了 ht.Math 的數學函數,裏面的 ht.Math.Vector2 指的即為二維向量,ht.Math.Vector3 則為三維的向量,可以傳入三個數值進行初始化向量,向量的原型中有 cross 方法用來計算兩個向量的法向量,例如以下偽代碼:

    1 var Vector3 = ht.Math.Vector3;
    2 var a = new Vector3([10, 10, 0]);
    3 var b = new Vector3([10, 0, 0]);
    4 var ab = a.clone().cross(b);

    以上代碼中 ab 即為計算法向量,a.clone 是為了避免 cross 運算會修改原本的 a 內容,所以克隆出一個新的向量進行叉乘,以下為示意圖:

    挖斗机械運動分析

    在進行挖斗部分的机械代碼時會將挖斗的位置以及挖斗所有連接點的設備轉化為相對於某個節點的相對位置,例如節點 A 在世界中的坐標為 [100, 100, 100],世界中還有一個節點 B,而且節點 B 的坐標為 [10, 10, 10] 則節點 A 相對於節點 B 的相對位置即為 [90, 90, 90],因為在計算挖斗的位置時,挖機可能此時已經運動到某一點或者旋轉到某一個軸,所以此時不能使用相對世界的坐標,需要使用相對挖機機身的相對坐標來進行計算,代碼中提供了 toLocalPostion(node, worldPosition) 用來將世界的坐標 worldPosition 轉化為相對 node 的相對坐標,以下為代碼實現:

    1 var Matrix4 = ht.Math.Matrix4,
    2 Vector3 = ht.Math.Vector3;
    3 var mat = new Matrix4().fromArray(this.getNodeMat(g3d, node)),
    4 matInverse = new Matrix4().getInverse(mat),
    5 position = new Vector3(worldPosition).applyMatrix4(matInverse);
    6 return position.toArray();

    該函數的返回值即為相對坐標,挖機中需要轉化的坐標為連接着挖斗以及小臂的兩個零部件,系統中用 armHinge 以及 bucketHinge 來分別表示小臂樞紐以及挖斗樞紐這兩個零部件,可以從側面來看挖斗的動作,從下圖可以看出,關鍵點是算出交點 P 的坐標,交點 P 的坐標則是以 armHinge 與 bucketHinge位置為圓心,armHinge 與 bucketHinge 的長度為半徑的兩個圓的交點,而且這兩個圓的圓心在挖斗旋轉的過程中是不斷變化的,所以需要通過數學計算不斷算出交點的位置,以下為示意圖:

    通過上圖可以知道交點的位置有兩個 p1 以及 p2,程序中通過計算圓心 1 與圓心 2 構成的向量 c2ToC1,以下為偽代碼:

    1 var Vector2 = ht.Math.Vector2;
    2 var c2ToC1 = new Vector2({ x: c1.x, y: c1.y }).sub(new Vector2({ x: c2.x, y: c2.y }));

    c1 和 c2 為 armHinge 以及 bucketHinge 的圓心坐標,接下來是計算圓心 2 與點 p1 以及 p2 構成的向量 c2ToP1 以及 c2ToP2,以下為偽代碼:

    1 var Vector2 = ht.Math.Vector2;
    2 var c2ToP1 = new Vector2({ x: p1.x, y: p1.y }).sub(new Vector2({ x: c2.x, y: c2.y }));
    3 var c2ToP2 = new Vector2({ x: p2.x, y: p2.y }).sub(new Vector2({ x: c2.x, y: c2.y }));

    通過上述操作我們可以獲得三個向量 c2ToC1c2ToP1c2ToP2 所以我們可以用到我上述講的向量叉乘的概念進行 p1 與 p2 點的選取,通過向量 c2ToC1 與 c2ToP1,以及向量 c2ToC1 與 c2ToP2 分別進行叉乘得到的結果肯定一個是大於 0 一個小於 0,二維向量的叉乘可以直接把它們視為 3d 向量,z軸補 0 的三維向量,不過二維向量叉乘的結果 result 不是向量而是數值,如果 result > 0 時,那麼 a 正旋轉到 b 的角度為 <180°,如果 k < 0,那麼 a 正旋轉到 b 的角度為 >180°,如果 k = 0 那麼a,b向量平行,所以通過上面的理論知識我們可以知道結果肯定是一個大於 0 一個小於 0,我們可以在程序中測下可以知道我們需要獲取的是大於 0 的那個點 P1,所以每次可以通過上述的方法進行兩個交點的選擇。

    以下為挖斗部分動畫的執行流程圖:

    通過上述運算之後我們可以獲取到最終需要的點 P 坐標,點 P 坐標即為挖斗與小臂連接部分的一個重要點,獲取該點之後我們可以通過 HT 中提供的 lookAtX 函數來實現接下來的操作,lookAtX 函數的作用為讓某個物體看向某一點,使用方式如下:

    1 node.lookAtX(position, 'bottom');

    node 即為需要看向某一個點的節點,position 為看向的點的坐標,第二個參數有六個枚舉值可以選擇,分別為 ‘bottom’,’back’,’front’,’top’,’right’,’left’,第二個參數的作用是當我們需要把某個物體看向某一個點的時候我們也要指定該物體的哪一個面看向該點,所以需要提供第二個參數來明確,獲取到該函數之後我們可以通過將 bucketHinge 看向點 P,armHinge 看向點 P,就可以保持這兩個連接的設備永遠朝向該點,以下為部分偽代碼:

    1 bucketHinge.lookAtX(P, 'front');
    2 armHinge.lookAtX(P, 'bottom');

    所以通過上述操作之後我們已經把挖斗部分的兩個關鍵零件的位置已經擺放正確,接下來是要正確的擺放與挖斗連接的小臂上液壓部分的位置,下一部分為介紹該節點如何進行擺放。

    液壓聯動分析

    在場景中我們可以看到液壓主要分為兩個部分,一部分為白色的較細的液壓桿,一部分為黑色的較厚的液壓桿,白色的液壓桿插在黑色的液壓桿中,所以在小臂或者挖斗旋轉的過程中我們要保持兩個節點始終保持相對的位置,通過上一步驟中我們可以知道 lookAtX 這個函數的作用,所以在液壓桿部分我們也是照樣用該函數來實現。

    在上一步我們獲取到了挖斗旋轉過程中的關鍵點 P,所以在挖斗旋轉的過程我們小臂上的液壓桿也要相應的進行變化,具體的操作就是將小臂的白色液壓桿的位置設置為上步中計算出來的點 P 的位置,當然需要把白色液壓桿的錨點進行相應的設置,之後讓白色液壓桿 lookAt 黑色液壓桿,同時讓黑色液壓桿 lookAt 白色液壓桿,這樣下來兩個液壓桿都在互相看着對方,所以它們呈現出來的效果就是白色液壓桿在黑色液壓桿中進行伸縮,以下為偽代碼:

    1 bucketWhite.p3(P);
    2 bucketWhite.lookAtX(bucketBlack.p3(), 'top');
    3 bucketBlack.lookAtX(P, 'bottom');

    代碼中 bucketWhite 節點即為小臂上白色液壓桿,bucketBlack 節點為小臂上黑色液壓桿,通過以上的設置就可以實現伸縮的動畫效果,以下為液壓的運行圖:

    同理挖機身上的大臂的液壓動作以及機身與大臂連接部分的液壓動作都是使用上面的方法來實現,以下為這兩部分的代碼:


     1 rotateBoom: (rotateVal) = >{
     2     excavatorBoomNode.setRotationX(dr * rotateVal);
     3     let archorVector = [0.5 - 0.5, 0.56 - 0.5, 0.22 - 0.5];
     4     let pos = projectUtil.toWorldPosition(g3d, excavatorBoomNode, archorVector);
     5     boomWhite.lookAtX(boomBlack.p3(), 'bottom');
     6     boomBlack.lookAtX(pos, 'top');
     7 },
     8 rotateArm: (rotateVal) = >{
     9     projectUtil.applyRelativeRotation(excavatorArmNode, excavatorBoomNode, -rotateVal);
    10     let archorVector = [0.585 - 0.5, 0.985 - 0.5, 0.17 - 0.5];
    11     let pos = projectUtil.toWorldPosition(g3d, excavatorArmNode, archorVector);
    12     armWhite.lookAtX(armBlack.p3(), 'bottom');
    13     armBlack.lookAtX(pos, 'top');
    14 }


    我將兩部分的運動封裝為兩個函數 rotateBoom 以及 rotateArm 分別是大臂與機身連接處的液壓運動與大臂上的液壓運動,在該部分中為了精確的獲取看向的點,我通過 toWorldPosition 方法將相對坐標轉化為世界坐標,相對坐標為黑白液壓桿的錨點坐標,轉化為相對大臂或者機身的世界坐標。

    基本運動分析

    挖機的基本運動包括前進後退,機身旋轉,這一部分會相對上面的運動簡單許多,在 HT 的三維坐標系中,不斷修改挖機機身的 x,y,z 的坐標值就可以實現挖機的前進後退,通過修改機身的 y 軸旋轉角度則可以控制機身的旋轉,當然挖機身體上的所有其它零部件需要吸附在機身身上,當機身進行旋轉時其它零部件則會進行相應的旋轉,在進行前進的時候挖機底部的履帶會進行對應的滾動,當然履帶我們這邊是用了一個履帶的貼圖貼在上面,當挖機前進的時候修改貼圖的偏移值就可以實現履帶的滾動,修改偏移值的偽代碼如下:

    1 node.s('shape3d.uv.offset', [x, y]);

    上面的 x,y 分別為 x 軸與 y 軸方向的偏移值,在挖機前進後退的過程中不斷修改 y 的值可以實現履帶的滾動效果,具體的文檔說明可以查看 

    在挖機前進後退的過程中我們可以 wasd 四個鍵同時按下,並且可以對按鍵進行一直的響應,在 js 中可以通過 document.addEventListener(‘keydown’, (e) => {}) 以及 document.addEventListener(‘keyup’, (e) => {}) 進行監聽,但是這隻能每次執行一次需要執行的動作,所以我們可以在外部起一個定時器,來執行 keydown 時候需要不斷執行的動作,可以用一個 keyMap 來記錄當前已經點擊的按鍵,在 keydown 的時候紀錄為 true 在 keyup 的時候記錄為 false,所以我們可以在定時器中判斷這個 bool 值,當為 true 的時候則執行相應的動作,否則不執行,以下為對應的部分關鍵代碼:


     1 let key_pressed = {
     2     65 : {
     3         status: false,
     4         action: turnLeft
     5     },
     6     87 : {
     7         status: false,
     8         action: goAhead
     9     },
    10     68 : {
    11         status: false,
    12         action: turnRight
    13     },
    14     83 : {
    15         status: false,
    16         action: back
    17     },
    18     37 : {
    19         status: false,
    20         action: bodyTurnLeft
    21     },
    22     39 : {
    23         status: false,
    24         action: bodyTurnRight
    25     }
    26 };
    27 setInterval(() = >{
    28     for (let key in key_pressed) {
    29         let {
    30             status,
    31             action
    32         } = key_pressed[key];
    33         if (status) {
    34             action();
    35         }
    36     }
    37 },
    38 50);
    39 document.addEventListener('keydown', (event) = >{
    40     let keyCode = event.keyCode;
    41     key_pressed[keyCode] && (key_pressed[keyCode].status = true);
    42     event.stopPropagation();
    43 },
    44 true);
    45 document.addEventListener('keyup', (event) = >{
    46     let keyCode = event.keyCode;
    47     key_pressed[keyCode] && (key_pressed[keyCode].status = false);
    48     event.stopPropagation();
    49 },
    50 true);


    從上面代碼可以看出我在 key_pressed 變量中記錄對應按鍵以及按鍵對應的 action 動作,在 keydown 與 keyup 的時候對應修改當前 key 的 status 的狀態值,所以可以在 Interval 中根據 key_pressed 這個變量的 status 值執行對應的 action 動作,以下為執行流程圖:

    HT 的輕量化,自適應讓當前系統在手機端也能流暢的運行,當然目前移動端與電腦端的 2D 圖紙部分是加載不同的圖紙,在移動端的 2D 部分只留下操作挖機的操作部分,其它部分進行了相應的捨棄,不然在移動端小屏幕下無法展示如此多的數據,在 3D 場景部分都是共用同一個場景,通過場景搭建部分的批量操作使得 3D 在手機端也十分流暢的運行,以下為手機端運行截圖:

    總結

    物聯網已經融入了現代生活,通過內嵌到机械設備中的电子設備,我們能夠完成對机械設備的運轉、性能的監控,以及對机械設備出現的問題進行及時的預警。在該系統 2D 面板監控部分就是對採集過來的數據進行可視化的展示,而且我們可以藉助大數據和物聯網技術,將一台台机械通過機載控制器、傳感器和無線通訊模塊,與一個龐大的網絡連接,每揮動一鏟、行動一步,都形成數據痕迹。大數據精準描繪出基礎建設開工率等情況,成為觀察固定資產投資等經濟變化的風向標。所以在實現上述挖機動作之後,通過與挖機傳感器進行連接之後,可以將挖掘機此時的真實動作通過數據傳遞到系統,系統則會根據動作進行相應的真實操作,真正實現了挖機與網絡的互聯互通。

    程序運行截圖:

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

    【其他文章推薦】

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

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

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

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

  • 自動任務調度 – Timer

    自動任務調度 – Timer

    一、概述:

    最近維護一個老項目,裏面使用的是Timer的時間調度器,以前沒接觸過,對着代碼鼓搗了半天,查閱了部分博客,最後總結出自己的見解,新項目一般是不會用這種老掉牙的時間調度器了,但是維護老項目還是用的着的。就當筆記記錄一下了,自己寫的才是符合自己的思路走向的。有時間再補上Quartz調度器,這個才是現在使用最多的。

    二、常用的三種調度器分類

    Java自帶的java.util.Timer類,這個類允許你調度一個java.util.TimerTask任務。使用這種方式可以讓你的程序按照某一個頻度執行,但不能在指定時間運行。

    使用Quartz,這是一個功能比較強大的的調度器,可以讓你的程序在指定時間執行,也可以按照某一個頻度執行,配置起來稍顯複雜。

    Spring3.0以後自帶的task,可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多。

    三、使用Spring體系來完成代碼的搭建

    1、代碼結構:

                                      

     

     

     

    2、springContext.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
           default-lazy-init="true">
    
        <!--定義了一個TimerFactoryBean類,並且把ScheduledTimerTask類的實例作為需要調度的task。-->
        <bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean" lazy-init="false">
            <property name="scheduledTimerTasks">
                <list>
                    <ref local="scheduledTask1"/>
                    <ref local="scheduledTask2"/>
                </list>
            </property>
        </bean>
    
        <!--利用ScheduledTimerTask類來配置每個task的啟動時間延時,每次啟動之間的間隔,當然還有最重要的是需要運行那個對象,也就是MethodInvokingTimerTaskFactoryBean類的實例-->
        <bean id="scheduledTask1" class="org.springframework.scheduling.timer.ScheduledTimerTask">
            <property name="delay" value="0" />
            <property name="period" value="1000" />
            <property name="timerTask">
                <ref bean="methodInvokingTask1"/>
            </property>
        </bean>
    
        <bean id="scheduledTask2" class="org.springframework.scheduling.timer.ScheduledTimerTask">
            <property name="delay" value="0" />
            <property name="period" value="1000" />
            <property name="timerTask">
                <ref bean="methodInvokingTask2"/>
            </property>
        </bean>
    
        <!--利用spring提供的MethodInvokingTimerTaskFactoryBean類來實現來實現對對task類和方法的聲明,聲明目標對象和方法,從而使spring知道要運行那個類的那個方法-->
        <bean id="methodInvokingTask1" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
            <property name="targetObject" ref="myTask1"/>
            <property name="targetMethod" value="run"/>
        </bean>
    
        <bean id="methodInvokingTask2" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
            <property name="targetObject" ref="myTask2"/>
            <property name="targetMethod" value="run"/>
        </bean>
    
        <!--被指定自動任務的類對象-->
        <bean id="myTask1" class="com.turtle.test.MyTask">
            <property name="name" value="啟動一"/>
        </bean>
    
        <bean id="myTask2" class="com.turtle.test.MyTask_2">
            <property name="name" value="啟動二"/>
        </bean>
    
    </beans>

     

    3、MyTask文件

    package com.turtle.test;
    
    import java.util.TimerTask;
    
    /**
     * 自定義一個定時任務
     * 推薦是繼承自 TimerTask
     */
    public class MyTask extends TimerTask {
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        private static int i = 0;
    
        // 使用線程中的方法  run
        @Override
        public void run() {
            System.out.println("定時任務啟動"+name+"----出現了"+i++);
        }
    }

     

    4、MyTask_2文件

    package com.turtle.test;
    
    import java.util.TimerTask;
    
    /**
     * 自定義一個定時任務
     * 推薦是繼承自 TimerTask
     */
    public class MyTask_2 extends TimerTask {
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        private static int i = 0;
    
        // 使用線程中的方法  run
        @Override
        public void run() {
            System.out.println("定時任務啟動"+name+"----出現了"+i++);
        }
    }

     

     

    5、MyTestTask_Test_01

    package com.turtle.test;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class MyTestTask_Test_01 {
        public static void main(String[] args) {
            // 啟動測試
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springContext.xml");
        }
    }

     

     

    6、結果:

     

                            

    四、總結:

    如果要使用TImer的調度器的話,推薦使用新的ScheduledExecutorService,這個目前沒使用,就沒進行代碼驗證了,推薦一博客,大概看了下,寫得挺好的

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

    【其他文章推薦】

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

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

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

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

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

  • PCA降維的原理、方法、以及python實現。

    PCA降維的原理、方法、以及python實現。

    參考:菜菜的sklearn教學之降維算法.pdf!!

    PCA(主成分分析法)

    1. PCA(最大化方差定義或者最小化投影誤差定義)是一種無監督算法,也就是我們不需要標籤也能對數據做降維,這就使得其應用範圍更加廣泛了。那麼PCA的核心思想是什麼呢?

    • 例如D維變量構成的數據集,PCA的目標是將數據投影到維度為K的子空間中,要求K<D且最大化投影數據的方差。這裏的K值既可以指定,也可以利用主成分的信息來確定。
    • PCA其實就是方差與協方差的運用。
    • 降維的優化目標:將一組 N 維向量降為 K 維,其目標是選擇 K 個單位正交基,使得原始數據變換到這組基上后,各變量兩兩間協方差為 0,而變量方差則盡可能大(在正交的約束下,取最大的 K 個方差)。

    2. PCA存在的問題:

    • 原來的數據中比如包括了年齡,性別,身高等指標降維后的數據既然維度變小了,那麼每一維都是什麼含義呢?這個就很難解釋了,所以PCA本質來說是無法解釋降維后的數據的物理含義,換句話說就是降維完啦計算機能更好的認識這些數據,但是咱們就很難理解了。
    • PCA對數據有兩個假設:數據必須是連續數值型;數據中沒有缺失值。
    • 過擬合:PCA 保留了主要信息,但這個主要信息只是針對訓練集的,而且這個主要信息未必是重要信息。有可能捨棄了一些看似無用的信息,但是這些看似無用的信息恰好是重要信息,只是在訓練集上沒有很大的表現,所以 PCA 也可能加劇了過擬合;

    3. PCA的作用:

    • 緩解維度災難:PCA 算法通過捨去一部分信息之後能使得樣本的採樣密度增大(因為維數降低了),這是緩解維度災難的重要手段;
    • 降噪:當數據受到噪聲影響時,最小特徵值對應的特徵向量往往與噪聲有關,將它們捨棄能在一定程度上起到降噪的效果;
    • 特徵獨立:PCA 不僅將數據壓縮到低維,它也使得降維之後的數據各特徵相互獨立

    4. 方差的作用:咱們可以想象一下,如果一群人都堆疊在一起,我們想區分他們是不是比較困難,但是如果這群人站在馬路兩側,我們就可以很清晰的判斷出來應該這是兩伙人。所以基於方差我們可以做的就是讓方差來去判斷咱們數據的擁擠程度,在這裏我們認為方差大的應該辨識度更高一些,因為分的比較開(一條馬路給隔開啦)。方差可以度量數值型數據的,數據若是想要區分開來,他那他們的離散程度就需要比較大,也就是方差比較大。

    5. 協方差的作用:

    6. 計算過程:(下圖為採用特徵值分解的計算過程,若採用SVM算法,則無需計算協方差矩陣!)

    為什麼我們需要協方差矩陣?我們最主要的目的是希望能把方差和協方差統一到一個矩陣里,方便後面的計算。

      假設我們只有 a 和 b 兩個變量,那麼我們將它們按行組成矩陣 X:(與matlab不同的是,在numpy中每一列表示每個樣本的數據,每一行表示一個變量。比如矩陣X,該矩陣表示的意義為:有m個樣本點,每個樣本點由兩個變量組成!)

      然後:

              

      Cov(a,a) = E[(a-E(a))(a-E(a))], Cov(b,a) = E[(b-E(b))(a-E(a))],因為E(b)=E(a)=0,所以大大簡化了計算!!!(這就體現了去中心化的作用!)

      我們可以看到這個矩陣對角線上的分別是兩個變量的方差,而其它元素是 a 和 b 的協方差。兩者被統一到了一個矩陣里。

    7. 特徵值與特徵向量的計算方法—--特徵值分解奇異值分解法(SVD)(有關特徵值與奇異值可見我的博文!)

    (1) 特徵值分解的求解過程較為簡單,以下圖為例子

    (2) 特徵值分解存在的缺點:

    • 特徵值分解中要求協方差矩陣A必須是方陣,即規模必須為n*n。
    • 後期計算最小投影維度K時,計算量過大。
    • 當樣本維度很高時,協方差矩陣計算太慢;

    (3) SVD算法(奇異值分解)的提出克服這些缺點,目前幾乎所有封裝好的PCA算法內部採用的都是SVD算法進行特徵值、特徵向量以及K值的求解。

    • 奇異值(每個矩陣都有):設A是一個mXn矩陣,稱正半定矩陣A‘A的特徵值的非負平方根為矩陣A的奇異值,其中A‘表示矩陣A的共扼轉置矩陣(實數矩陣的共軛就是轉置矩陣,複數矩陣的共軛轉置矩陣就是上面所說的行列互換后每個元素取共軛)
    • 只有方陣才有特徵值。

    (4) SVD算法的計算過程:(numpy中已經將SVD進行了封裝,所以只需要調用即可)

    可以發現,採用SVD算法無需計算協方差矩陣,這樣在數據量非常大的時候可以降低消耗。

    • A為數據矩陣,大小為M*N(2*5)
    • U是一個由與數據點之間具有最小投影誤差的方向向量所構成的矩陣,大小為M*M(2*2),假如想要將數據由M維降至K維,只需要從矩陣U中選擇前K個列向量,得到一個M*K的矩陣,記為Ureduce。按照下面的公式即可計算降維后的新數據:降維后的數據矩陣G = A.T * Ureduce. 
    • sigma為一個列向量,其包含的值為矩陣A的奇異值。
    • VT是一個大小為N*N的矩陣,具體意義我們無需了解。

    利用python實現PCA降維(採用SVD的方法):

     1 from numpy import linalg as la
     2 import numpy as np
     3 #1.矩陣A每個變量的均值都為0,所以不用進行“去平均值”處理。倘若矩陣A的每個變量的均值不為0,則首先需要對數據進行預處理
     4 #  才可以進行協方差矩陣的求解。
     5 #2.與matlab不同的是,在numpy中每一列表示每個樣本的數據,每一行表示一個變量。
     6 #  比如矩陣A,該矩陣表示的意義為:有5個樣本點,每個樣本點由兩個變量組成!
     7 #3.np.mat()函數中矩陣的乘積可以使用 * 或 .dot()函數
     8 #  array()函數中矩陣的乘積只能使用 .dot()函數。而星號乘(*)則表示矩陣對應位置元素相乘,與numpy.multiply()函數結果相同。
     9 A = np.mat([[-1, -1, 0, 2, 0], [-2, 0, 0, 1, 1]])
    10 # A = np.mat([[-1, -2], [-1, 0], [0, 0], [2, 1], [0, 1]]).T
    11 U, sigma, VT = la.svd(A)
    12 print("U:")
    13 print(U)
    14 print("sigma:")
    15 print(sigma)
    16 print("VT:")
    17 print(VT)
    18 print("-"*30)
    19 print("降維前的數據:")
    20 print(A.T)
    21 print("降維后的數據:")
    22 print(A.T * U[:,0])

    運行結果圖:與上文採用特徵值分解所得到的降維結果一致!

    8.PCA的重建

     眾所周知,PCA可以將高維數據壓縮為較少維度的數據,由於維度有所減少,所以PCA屬於有損壓縮,也就是,壓縮后的數據沒有保持原來數據的全部信息,根據壓縮數據無法重建原本的高維數據,但是可以看作原本高維數據的一種近似。

     還原的近似數據矩陣Q = 降維后的矩陣G * Ureduce.T

    9.採用sklearn封裝好的PCA實現數據降維(採用的是SVD算法):

     1 import numpy as np
     2 from sklearn.decomposition import PCA
     3 # 利用sklearn進行PCA降維處理的時候,數據矩陣A的行數表示數據的個數,數據矩陣A的列數表示每條數據的維度。這與numpy中是相反的!
     4 # A = np.mat([[-1, -1, 0, 2, 0], [-2, 0, 0, 1, 1]]).T
     5 A = np.mat([[-1, -2], [-1, 0], [0, 0], [2, 1], [0, 1]])
     6 pca = PCA(n_components = 1)
     7 pca.fit(A)
     8 # 投影后的特徵維度的方差比例
     9 print(pca.explained_variance_ratio_)
    10 # 投影后的特徵維度的方差
    11 print(pca.explained_variance_)
    12 print(pca.transform(A))

     可以發現,採用sklearn封裝的方法實現PCA與上文的方法達到的結果一致!

    10.如何確定主成分數量(針對於Sklearn封裝的PCA方法而言)

    PCA算法將D維數據降至K維,顯然K是需要選擇的參數,表示要保持信息的主成分數量。我們希望能夠找到一個K值,既能大幅降低維度,又能最大限度地保持原有數據內部的結構信息。實現的過程是通過SVD方法得到的S矩陣進行操作求解,

     

    11.sklearn中封裝的PCA方法的使用介紹。

    PCA的函數原型

     (1)主要參數介紹

    n_components

    • 這個參數類型有int型,float型,string型,默認為None。 它的作用是指定PCA降維后的特徵數(也就是降維后的維度)。 
    • 若取默認(None),則n_components==min(n_samples, n_features),即降維后特徵數取樣本數和原有特徵數之間較小的那個;
    • 若n_components}設置為‘mle’並且svd_solver設置為‘full’則使用MLE算法根據特徵的方差分佈自動去選擇一定數量的主成分特徵來降維; 
    • 若0<n_components<1,則n_components的值為主成分方差的閾值; 通過設置該變量,即可調整主成分數量K。
    • 若n_components≥1,則降維后的特徵數為n_components; 

    copy

    •  bool (default True) 
    • 在運行算法時,將原始訓練數據複製一份。參數為bool型,默認是True,傳給fit的原始訓練數據X不會被覆蓋;若為False,則傳給fit后,原始訓練數據X會被覆蓋。 

    whiten

    • bool, optional (default False)
    • 是否對降維后的數據的每個特徵進行歸一化。參數為bool型,默認是False。

    (2)主要方法介紹:

    fit(X,y=None) :用訓練數據X訓練模型,由於PCA是無監督降維,因此y=None。 

    transform(X,y=None) :對X進行降維。 

    fit_transform(X) :用訓練數據X訓練模型,並對X進行降維。相當於先用fit(X),再用transform(X)。 

    inverse_transform(X) :將降維后的數據轉換成原始數據。(PCA的重建)

     (3)主要屬性介紹:

    components:array, shape (n_components, n_features) ,降維后各主成分方向,並按照各主成分的方差值大小排序。 

    explained_variance:array, shape (n_components,) ,降維后各主成分的方差值,方差值越大,越主要。 

    explained_variance_ratio:array, shape (n_components,) ,降維后的各主成分的方差值佔總方差值的比例,比例越大,則越主要。 

    singular_values:array, shape (n_components,) ,奇異值分解得到的前n_components個最大的奇異值。

     

     二、LDA

    1. 類間距離最大,類內距離最小(核心思想)

    2. LDA的原理,公式推導見西瓜書,這裏主要講一下PCA與LDA的異同點!

    • PCA為非監督降維,LDA為有監督降維PCA希望投影后的數據方差盡可能的大(最大可分性),因為其假設方差越多,則所包含的信息越多;而LDA則希望投影后相同類別的組內方差小,而組間方差大。LDA能合理運用標籤信息,使得投影后的維度具有判別性,不同類別的數據盡可能的分開。舉個簡單的例子,在語音識別領域,如果單純用PCA降維,則可能功能僅僅是過濾掉了噪聲,還是無法很好的區別人聲,但如果有標籤識別,用LDA進行降維,則降維后的數據會使得每個人的聲音都具有可分性,同樣的原理也適用於臉部特徵識別。
    • 所以,可以歸納總結為有標籤就盡可能的利用標籤的數據(LDA),而對於純粹的非監督任務,則還是得用PCA進行數據降維。
    • LDA降維最低可以降維到(類別數-1),而PCA沒有限制

     

    參考資料:https://zhuanlan.zhihu.com/p/77151308?utm_source=qq&utm_medium=social&utm_oi=1095998405318430720

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

    【其他文章推薦】

    台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

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

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

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

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