模式識別與機器學習筆記專欄之貝恭弘=叶 恭弘斯分類決策(一)

目錄

  • 1. 貝恭弘=叶 恭弘斯公式
  • 2. 最小錯誤率貝恭弘=叶 恭弘斯決策
  • 3. 最小風險貝恭弘=叶 恭弘斯決策

這是模式識別與機器學習筆記專欄的第一篇,我會持續更新。

在所有的生活場景中,我們無時無刻不在進行着模式識別。比如你看見迎面走來一個人,根據他的長相來辨認出他好像是你一年前某個活動小組的組長,然後你開始決策要不要和他打個招呼。或者你走進水果店,把西瓜拍了個遍來決定最後買哪一個。或者你突然被捂上眼睛,聽着背後人的聲音來辨別是不是你的親愛的。

模式(pattern) 可以理解成某種特徵,也就是你可以獲取到的某種原始數據,而 模式識別(pattern recognition) 就是根據輸入原始數據來判斷其類別並採取相應行為的能力。它對我們至關重要,但我們常常希望可以有機器幫我們來做這個工作,讓機器執行預定的程序來進行分類從而決策。比如一個短信攔截系統,幫我們分辨哪些是騷擾短信,哪些是有用的信息。

在這個問題上,貝恭弘=叶 恭弘斯決策理論是最最經典而基本的分類方法了。那麼,何為貝恭弘=叶 恭弘斯分類決策?

1. 貝恭弘=叶 恭弘斯公式

首先,我們熟悉的貝恭弘=叶 恭弘斯公式

\[P(\omega_i|x)=\frac{p(x|\omega_i)P(\omega_i)}{p(x)} \]

在模式識別問題中,用 \(d\) 維向量 \(x\) 來表示希望分類對象的特徵,它一般是從傳感器獲取,並且抽象化出來。\(\omega\) 來表示可能分類的類別。\(\omega_i\) 對應着第 \(i\) 類,如果是一個兩類問題,\(i=1,2\) ,如果是 \(c\) 類問題,則 \(i=1,2,…,c\)

\(P(\omega_i|x)\) 是由特徵 \(x\) 預測的結果,也就是后驗概率,\(p(x|\omega_i)\) 是類條件概率,或者叫似然概率,就是特徵 \(x\) 這個隨機變量分佈情況,它是取決於類別 \(\omega\) 的狀態的。\(P(\omega_i)\)是類先驗信息,是根據先前知識經驗給定的,並且因為總共就c類,所以很容易得到\(\sum^{c}_{j=1}P(\omega_j)=1\)\(p(x)\)是歸一化因子,並不重要:

\[p(x)=\sum^{c}_{j=1}p(x|\omega_j)P(\omega_j) \]

目的就是使得所有后驗概率之和為1。

貝恭弘=叶 恭弘斯公式提供了一個后驗概率的重要計算依據:從似然概率和先驗概率得到。

2. 最小錯誤率貝恭弘=叶 恭弘斯決策

首先簡化問題為二分類問題,比如短信分類問題,\(\omega=\omega_1\) 是將短信分為有用短信,\(\omega=\omega_2\) 是將短信分類為垃圾短信。假設我們現在對這兩類的先驗概率和特徵 \(x\) 的類條件概率分佈都知道了。那麼通過一個短信提取到的特徵 \(x\) ,就可以利用貝恭弘=叶 恭弘斯公式計算后驗概率,也就是對可能的兩類做出的概率判斷。

\[P(\omega_1|x)=p(x|\omega_1)P(\omega_1)\\ P(\omega_2|x)=p(x|\omega_2)P(\omega_2) \]

很自然的來比較后驗概率來進行決策,哪一類的后驗概率大,就判定為哪一類,先驗是給定的,歸一化因子不重要,實質上比的就是類條件概率分佈。

  • 現在引入一個錯誤率 \(P(error|x)\) 的概念,對一個\(x\) ,算出了 \(P(\omega_1|x)\)\(P(\omega_2|x)\),假如我們讓\(\omega=\omega_1\),也就是判定為第一類,把這條短信判斷成有用的,那麼我們判斷正確的概率就是 \(P(\omega_1|x)\) ,而判斷錯誤的概率就是\(P(\omega_2|x)\)。寫成公式:

\[P(error|x)= \begin{cases} P(\omega_1|x)& \text{如果判定為}\omega_2 \\ P(\omega_2|x)& \text{如果判定為}\omega_1 \end{cases} \]

  • 我們希望我們判斷的錯誤率更小,因此我們得到判決規則:

如果\(P(\omega_1|x)>P(\omega_2|x)\),判定為 \(\omega_1\);否則判定為 \(\omega_2\)

——這就是最小錯誤率貝恭弘=叶 恭弘斯決策,也就是哪一類后驗概率大,判為哪一類

  • 寫成似然概率和先驗概率的形式:

如果\(p(x|\omega_1)P(\omega_1)>p(x|\omega_2)P(\omega_2)\),判定為 \(\omega_1\);否則判定為 \(\omega_2\)

3. 最小風險貝恭弘=叶 恭弘斯決策

下面把判決規則升級一下。

再回想一下短信分類的問題。假如預測成有用短信和騷擾短信的后驗概率接近的時候,這時候誤判的可能性還是比較高的。如果誤判,可能會把有用的分成垃圾,把垃圾短信分成有用的。可以想象這兩者的錯誤率是此消彼長的,但對哪種的錯誤率容忍度更高呢?把有用的分成垃圾的看起來更加難以接受。這時候可能就希望那種模稜兩可的情況還是判定成有用的好。那麼如何來體現這種對錯誤率容忍度的不同呢?下面就引入損失函數。

對每一種判斷以及真實情況定義一個損失函數\(\lambda(\alpha_i|\omega_j)\),以下面的兩類問題為例

\(\lambda(\alpha_i\vert\omega_j)\) \(\omega_1\) \(\omega_2\)
\(\alpha_1\) 0 1
\(\alpha_2\) 2 0

\(\omega_j\) 表示要分類對象的真實類別是 \(\omega_j\)\(\alpha_i\) 表示要採取的行為,即判定為 \(\omega_i\)

以短信分類為例,假如真實是\(\omega_1\) ,有用短信,採取\(\alpha_1\) ,判斷為有用,也就是判斷正確了,可以定義損失就是0。假如真實是\(\omega_2\) ,垃圾短信,採取\(\alpha_1\) ,判斷為有用,也就是判斷錯誤了,可以定義損失函數為1。假如真實是\(\omega_1\) ,有用短信,採取\(\alpha_2\) ,判斷為垃圾,同樣是判斷錯誤了,而這種錯誤我們的容忍度更低,那麼可以定義損失函數為2。

  • 損失函數乘以對應的后驗概率\(P(\omega_j|x)\) 並求和,得到風險函數\(R(\alpha_i|x)\)

\[R(\alpha_1|x)=\lambda(\alpha_1|\omega_1)P(\omega_1|x) +\lambda(\alpha_1|\omega_2)P(\omega_2|x)\\ R(\alpha_2|x)=\lambda(\alpha_2|\omega_1)P(\omega_1|x) + \lambda(\alpha_2|\omega_2)P(\omega_2|x) \]

理解起來就是:\(\alpha_i\)行為的風險=每種 \(\omega\) 情況下採取\(\alpha_i\)行為的損失x是這種 \(\omega\) 的后驗概率

  • 與最小錯誤率貝恭弘=叶 恭弘斯決策相對應的,這時候使得風險函數最小就行了,判決規則寫成:

如果\(R(\alpha_1|x) < R(\omega_2|x)\),採取行為\(\alpha_1\) ,也就是判定為 \(\omega_1\);否則採取行為\(\alpha_2\) ,也就是判定為 \(\omega_2\)

因此決策的方式就是採取風險\(R(\alpha_i|x)\)最小的行為\(\alpha_i\)——這是最小風險貝恭弘=叶 恭弘斯決策

  • \(\lambda(\alpha_i|\omega_j)\) 簡寫成\(\lambda_{ij}\) ,並把類條件概率和先驗概率代入,得到判決規則:

如果\((\lambda_{11}-\lambda_{21})p(x|\omega_1)P(\omega_1) < (\lambda_{22}-\lambda_{12})p(x|\omega_2)P(\omega_2)\),採取行為\(\alpha_1\) ,也就是判定為 \(\omega_1\);否則採取行為\(\alpha_2\) ,也就是判定為 \(\omega_2\)

  • 還可以寫成似然比的形式:

如果\(\frac{p(x|\omega_1)}{p(x|\omega_2)}<\frac{(\lambda_{22}-\lambda_{12})}{(\lambda_{11}-\lambda_{21})}\frac{P(\omega_2)}{P(\omega_1)}\) ,採取行為\(\alpha_1\) ,也就是判定為 \(\omega_1\);否則採取行為\(\alpha_2\) ,也就是判定為 \(\omega_2\)

這樣寫的好處是,不等式右邊的損失函數和先驗概率都是給定的,是一個常數,左邊就是似然概率之比,所以只需要算出似然概率之比就可以進行分類預測

  • 另外,如果採用如下0-1損失函數的時候,最小風險貝恭弘=叶 恭弘斯決策就會退化成最小錯誤率貝恭弘=叶 恭弘斯決策
\(\lambda(\alpha_i\vert\omega_j)\) \(\omega_1\) \(\omega_2\)
\(\alpha_1\) 0 1
\(\alpha_2\) 1 0

\[R(\alpha_1|x)=\lambda(\alpha_1|\omega_1)P(\omega_1|x)+\lambda(\alpha_1|\omega_2)P(\omega_2|x)=P(\omega_2|x)\\ R(\alpha_2|x)=\lambda(\alpha_2|\omega_1)P(\omega_1|x) + \lambda(\alpha_2|\omega_2)P(\omega_2|x)=P(\omega_1|x) \]

  • 如果是多類情況

\[R(\alpha_i|x)=\sum^c_{j=1}\lambda(\alpha_i|\omega_j)P(\omega_j|x) \]

決策行為\(\alpha^*=argminR(\alpha_i|x)\) ,也就是採取的行為\(\alpha_i\) 是使得風險\(R(\alpha_i|x)\) 最小的那個\(\alpha_i\)

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

【其他文章推薦】

※超省錢租車方案

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

※回頭車貨運收費標準

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

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

對馬克宏很失望 法環境部長請辭 「不想再騙自己」

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

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

【其他文章推薦】

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

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

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

※超省錢租車方案

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

加州議會通過法案 2045年前100%清潔能源

摘錄自2018年8月30日世界日報報導

加州州議會29日準備將一項畫時代的法案送交州長簽署,這項法案規定,加州在2045年前將電力供應全面變為清潔能源,不再使用煤和石油發電,100%改用太陽能、風力和其他再生能源。

由州參議會議長德利昂提出的SB100號法案,先獲州參議會通過,29日再獲州眾議會以43票對32票通過;州眾議會進行了修改,所以須再送回州參議會通過,就可以送交州長簽署。州議會今年的會期,將於本周結束,所以SB100估計可於周末前送交州長。

加州的公用事業公司包括太平洋瓦電和聖地牙哥瓦電,都反對SB100。美西各州石油協會和其他組織也反對。

布朗州長對SB100保持沉默,沒有說是否簽署,雖然他是加州反暖運動的先鋒。明年可能接替布朗做州長的紐森,曾說要以100%清潔能源作為加州的目標,但是他也沒有對SB100表態。

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

【其他文章推薦】

※超省錢租車方案

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

※回頭車貨運收費標準

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

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

看好電動車需求,嘉能可加大投入銅鈷鎳的生產

  路透社12月5日報導,全球五大礦商之一的嘉能可(Glencore plc)加大投入電動車電池所需金屬的生產,因看好電動車市場的成長。路透社委託S&P Global Market Intelligence所做的研究顯示,嘉能可過去五年的銅與鈷產量都已經倍增,鎳產量更是四倍增長。其中,該公司銅產量從2011年的70萬噸增加至2016年的140萬噸,鈷產量從2011年的12,880公噸增加至2016年的28,300公噸,鎳產量從2011年的28,500公噸增加至2016年的115,100公噸。   報告顯示,銅鈷鎳等電動車相關金屬佔嘉能可核心獲利的五成比重,相比競爭對手包括力拓(Rio Tinto)、必和必拓(BHP Billiton)以及英美資源(Anglo American)等高出一倍。另一方面,嘉能可的股價自2015年以來已經上漲400%,2017年至今的漲幅也超過20%,表現也同樣優於其他三家競爭對手。 2017年1~9月,嘉能可銅產量較去年同期的106萬噸減少11%至94.65萬噸,主要由於尚比亞銅礦遭遇供電問題的影響。嘉能可也將今年全年的銅產量目標下調2%至131萬噸,較該公司去年的銅產量將減少8%。今年第三季,該公司的銅產量年減15%至30.36萬噸。   2017年1~9月,嘉能可的鋅產量年增4.8%至82.74萬噸,但是第三季的產量年減9%至25.66萬噸,較前季也減少12%。該公司也將全年的鋅產量目標下調2%至113萬噸。1~9月,該公司鎳產量年減2%至80,700公噸,全年產量則預估較去年持平為115,000公噸。   必和必拓商務長巴爾惠森(Arnoud Balhuizen)稱銅是「未來的金屬」,因2017年電動車迎來革命性的一年,市場大大低估了銅的需求潛力。國際銅業協會(International Copper Association)報告表示,電動汽車的產業增長,可望令未來十年該產業的銅需求量大幅增長,預估將從2017年的18.5萬噸增長至2027年的174萬噸,主要因為電動汽車較傳統汽車使用更多銅的影響。   加拿大蒙特利爾銀行資本市場(BMO Capital Markets)12月4日報告表示,受惠電動車電池需求的增長,鈷的價格在未來兩年預期將會大幅攀升。報告預估,鈷的價格將從當前的每磅30美元,上漲至2019年的每磅40.50美元(每噸89,290美元),並且不排除有倍增的可能。鈷價2017年至今已經上漲一倍,年初的價格約為每磅14.75美元。電動車電池的正極材料包括鋰、鈷與鎳,負極材料包括石墨與銅箔。   (本文內容由授權使用。首圖來源:public domain CC0)  

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

【其他文章推薦】

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

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

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

※超省錢租車方案

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

聚甘新

拚空污防制,政院:目標2040年汽車全面電動化

  為整合部會推動空氣品質改善工作,行政院長賴清德12月21日在行政院會聽取環保署「空氣污染防制行動方案」報告,並於會後親自召開記者會。賴清德表示,國人對空氣品質的要求日益提升,政府展現決心,針對不同汙染源也提出「空氣污染防制行動方案:紅害減半大作戰」,除加強執行已律定的政策外,也提出新的管制與防制措施。相關指標性政策目標,包括2019年空污紅害日減半、2035年機車全面電動化、2040年汽車全面電動化等目標。   賴揆指出,今年4月林全前院長核定「空氣污染防制策略」,經相關部會與地方縣市政府努力,空污減量已獲初步成果。近期民眾、專家學者及社會團體輿論,要求政府進一步對空氣汙染問題提出更有效的方法,因此上週行政院會通過「空氣汙染防製法」修正草案,並在與立法委員溝通,聽取地方政府意見後,於院會提出「空氣污染防制行動方案」。會請各部會與環保署共同推動、逐項落實,未來政院也會加強與地方政府合作,希望化危機為轉機。   賴揆表示,地方政府實際執行空氣汙染防制的相關工作,尤其桃園、台中、雲林及高雄等設有火力發電廠的縣市,直接承受來自民眾的壓力;而台中市整合雲林縣、嘉義縣、嘉義市、苗栗縣、彰化縣及南投縣6縣市的建議,包括加速綠能發電;訂定全國鍋爐加嚴排放標準並全面補助;增加空污基金地方分配比例;捷運延伸中台灣以及公車營運補助全面加碼等4項要求,與政院的目標不謀而合。   環保署則明確表示,「空氣污染防制行動方案」訂定數項指標性政策目標,包括2019年空污紅害日減半、2030年公務車輛全面電動化、2035年機車全面電動化、2040年汽車全面電動化等目標;針對細懸浮微粒排放量較大者,提出具體管制與防制措施,包括要求國營事業達超低排放的世界最嚴標準、全面禁止烏賊車上路、加強餐飲業油煙、道路、營建工程及河川揚塵的管理等。   環保署並指出,除修法加嚴標準或加重罰則、擴大處分對象等行政手段外,也將提供優惠貸款以鼓勵業者汰換高污染的老舊大客貨車,目標自2018年起,將8萬輛一、二期老舊柴油大貨車汰換為符合最新的環保排放標準,1萬輛公車全面更換為電動車。   賴揆也進一步強調,空污問題並非是環保署或地方政府可以獨立面對,是需要跨部會共同合作。同時也希望地方政府與中央攜手執行,研議訂定紅害減半目標,並請上述7縣市針對固定與移動汙染源等屬於地方政府負責事項,擬訂具體策略。   (本文內容由授權使用。首圖來源:public domain CC0)  

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

【其他文章推薦】

※超省錢租車方案

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

※回頭車貨運收費標準

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

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

聚甘新

Spark如何與深度學習框架協作,處理非結構化數據

隨着大數據和AI業務的不斷融合,大數據分析和處理過程中,通過深度學習技術對非結構化數據(如圖片、音頻、文本)進行大數據處理的業務場景越來越多。本文會介紹Spark如何與深度學習框架進行協同工作,在大數據的處理過程利用深度學習框架對非結構化數據進行處理。

Spark介紹

Spark是大規模數據處理的事實標準,包括機器學習的操作,希望把大數據處理和機器學習管道整合。

Spark使用函數式編程範式擴展了MapReduce模型以支持更多計算類型,可以涵蓋廣泛的工作流。Spark使用內存緩存來提升性能,因此進行交互式分析也足夠快速(如同使用Python解釋器,與集群進行交互一樣)。緩存同時提升了迭代算法的性能,這使得Spark非常適合機器學習。

由於Spark庫提供了Python、Scale、Java編寫的API,以及內建的機器學習、流數據、圖算法、類SQL查詢等模塊;Spark迅速成為當今最重要的分佈式計算框架之一。與YARN結合,Spark提供了增量,而不是替代已存在的Hadoop集群。在最近的Spark版本中,Spark加入了對於K8s的支持,為Spark與AI能力的融合提供了更好的支持。

 

深度學習框架介紹

TensorFlow

TensorFlow最初是由Google機器智能研究部門的Google Brain團隊開發,基於Google 2011年開發的深度學習基礎架構DistBelief構建起來的。由於Google在深度學習領域的巨大影響力和強大的推廣能力,TensorFlow一經推出就獲得了極大的關注,並迅速成為如今用戶最多的深度學習框架。

TensorFlow是一個非常基礎的系統,因此也可以應用於眾多領域。但由於過於複雜的系統設計,對讀者來說,學習TensorFlow底層運行機制更是一個極其痛苦的過程。TensorFlow的接口一直處於快速迭代之中,並且沒有很好地考慮向後兼容性,這導致現在許多開源代碼已經無法在新版的TensorFlow上運行,同時也間接導致了許多基於TensorFlow的第三方框架出現BUG。

Keras

Keras 於2015年3月首次發布,擁有“為人類而不是機器設計的API”,得到Google的支持。它是一個用於快速構建深度學習原型的高層神經網絡庫,由純Python編寫而成,以TensorFlow、CNTK、Theano和MXNet為底層引擎,提供簡單易用的API接口,能夠極大地減少一般應用下用戶的工作量。

嚴格意義上講,Keras並不能稱為一個深度學習框架,它更像一個深度學習接口,它構建於第三方框架之上。Keras的缺點很明顯:過度封裝導致喪失靈活性。Keras最初作為Theano的高級API而誕生,後來增加了TensorFlow和CNTK作為後端。學習Keras十分容易,但是很快就會遇到瓶頸,因為它缺少靈活性。另外,在使用Keras的大多數時間里,用戶主要是在調用接口,很難真正學習到深度學習的內容。

PyTorch

PyTorch於2016年10月發布,是一款專註於直接處理數組表達式的低級API。 前身是Torch(一個基於Lua語言的深度學習庫)。Facebook人工智能研究院對PyTorch提供了強力支持。PyTorch支持動態計算圖,為更具數學傾向的用戶提供了更低層次的方法和更多的靈活性,目前許多新發表的論文都採用PyTorch作為論文實現的工具,成為學術研究的首選解決方案。

Caffe/Caffe2.0

Caffe的全稱是Convolutional Architecture for Fast Feature Embedding,它是一個清晰、高效的深度學習框架,於2013年底由加州大學伯克利分校開發,核心語言是C++。它支持命令行、Python和MATLAB接口。Caffe的一個重要特色是可以在不編寫代碼的情況下訓練和部署模型。如果您是C++熟練使用者,並對CUDA計算游刃有餘,你可以考慮選擇Caffe。

在Spark大數據處理中使用深度學習框架

在Spark程序中使用一個預訓練過的模型,將其并行應用於大型數據集的數據處理。比如,給定一個可以識別圖片的分類模型,其通過一個標準數據集(如ImageNet)訓練過。可以在一個Spark程序中調用一個框架(如TensorFlow或Keras)進行分佈式預測。通過在大數據處理過程中調用預訓練模型可以直接對非結構化數據進行直接處理。

我們重點介紹在Spark程序中使用Keras+TensorFlow來進行模型推理。

使用深度學習處理圖片的第一步,就是載入圖片。Spark 2.3中新增的ImageSchema包含了載入數百萬張圖像到Spark DataFrame的實用函數,並且以分佈式方式自動解碼,容許可擴展地操作。

使用Spark’s ImageSchema:

from pyspark.ml.image import ImageSchema
image_df = ImageSchema.readImages("/data/myimages")
image_df.show()

也可以利用Keras的圖片處理庫:

from keras.preprocessing import image
img = image.load_img("/data/myimages/daisy.jpg", target_size=(299, 299))

可以通過圖片路徑來構造Spark DataFrame:

def get_image_paths_df(sqlContext, dirpath, colName):
    files = [os.path.abspath(os.path.join(dirpath, f)) for f in os.listdir(dirpath) if f.endswith('.jpg')]
    return sqlContext.createDataFrame(files, StringType()).toDF(colName)

使用Keras接口加載預訓練模型:

from keras.applications import InceptionV3
model = InceptionV3(weights="imagenet")
model.save('/tmp/model-full.h5')
model = load_model('/tmp/model-full.h5')

定義圖片識別推理方法:

def iv3_predict(fpath):
            model = load_model('/tmp/model-full.h5')
            img = image.load_img(fpath, target_size=(299, 299))
            x = image.img_to_array(img)
            x = np.expand_dims(x, axis=0)
            x = preprocess_input(x)
 
            preds = model.predict(x)
            preds_decode_list = decode_predictions(preds, top=3)
            tmp = preds_decode_list[0]
            res_list = []
            for x in tmp:
                res = [x[0], x[1], float(x[2])]
                res_list.append(res)
            return res_list

定義推理輸入結果Schema:

def get_labels_type():    
    ele_type = StructType()    
    ele_type.add("class", data_type=StringType())    
    ele_type.add("description", data_type=StringType())    
    ele_type.add("probability", data_type=FloatType())    
    return ArrayType(ele_type)

將推理方法定義成Spark UDF:

spark.udf.register("iv3_predict", iv3_predict, returnType=get_labels_type())

載入圖片定義為數據表:

df = get_image_paths_df(self.sql)
df.createOrReplaceTempView("_test_image_paths_df")

使用SQL語句對接圖片進行處理:

df_images = spark.sql("select fpath, iv3_predict(fpath) as predicted_labels from _test_image_paths_df")
df_images.printSchema()
df_images.show(truncate=False)

結語

在大數據Spark引擎中使用深度學習框架加載預處理模型,來進行非結構數據處理有非常多的應用場景。但是由於深度學習框架目前比較多,模型與框架本身是深度耦合,在大數據環境中安裝和部署深度學習框架軟件及其依賴軟件會非常複雜,同時不利於大數據集群的管理和維護,增加人力成本。

華為雲DLI服務,採用大數據Serverless架構,用戶不需要感知實際物理集群,同時DLI服務已經在大數據集群中內置了AI計算框架和底層依賴庫(Keras/tensorflow/scikit-learn/pandas/numpy等)。DLI最新版本中已經支持k8s+Docker生態,並開放用戶自定義Docker鏡像能力,提供給用戶來擴展自己的AI框架、模型、算法包。在Serverless基礎上,為用戶提供更加開放的自定義擴展能力。

DLI支持多模引擎,企業僅需使用SQL或程序就可輕鬆完成異構數據源的批處理、流處理等,挖掘和探索數據信息,揭示其中的規律並發現數據潛在價值,華為雲618年中鉅惠,大數據+AI專場,歷史低價,助力企業“智能化”,業務“數據化”。

 

點擊關注,第一時間了解華為雲新鮮技術~

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

【其他文章推薦】

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

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

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

※超省錢租車方案

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

聚甘新

C# WPF – MVVM實現OPC Client管理系統

前言

本文主要講解採用WPF MVVM模式設計OPC Client的過程,算作對於WPF MVVM架構的學習記錄吧!不足之處請不吝賜教,感謝!

涉及知識點

  • C#基礎
  • Xaml基礎
  • 命令、通知和數據綁定
  • Prism+Blend
  • MahApps.Metro(第三方框架)
  • OPC

項目實現功能

  • 用戶登陸(模擬登陸過程,未連接數據庫)
  • OPC同步讀寫、異步讀寫操作等

開發環境

  • Window 10
  • Visual Studio 2019
  • .Net Framework 4.8

成品效果圖

項目詳解

MVVM框架搭建

為了節省開發時間,在事件綁定上使用了Prism框架,OPC通信方面使用了OPCDAAuto.dll類庫,二者均可以通過Nuget方式安裝到項目中。

  • 定義了一個DelegateCommand類用來處理屬性和命令;
  • 定義了一個NotificationObject類用來通知屬性和命令的改變;

注意:在使用事件綁定時,需要添加引用 xmlns:i=”http://schemas.microsoft.com/xaml/behaviors”,然後根據控件對應事件的名稱設置綁定命令即可。

比如我們想給ComboBox的SelectionChanged事件設置一個事件綁定,可這麼寫

xaml代碼:

<ComboBox
    x:Name="CombServerList"
    Width="120"
    Margin="{StaticResource ControlMargin}"
    ItemsSource="{Binding ServerList}">
    <!--  事件綁定  -->
    <i:Interaction.Triggers>
          <i:EventTrigger EventName="SelectionChanged">
             <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding ElementName=CombServerList}" />
          </i:EventTrigger>
     </i:Interaction.Triggers>

</ComboBox>

View Code

VM代碼:

        public ICommand SelectionChangedCommand
        {
            get
            {
                return new Prism.Commands.DelegateCommand<ComboBox>((combobox) =>
                {
                   // 業務邏輯
                });
            }
        }

View Code

相關類的定義代碼如下:

 public class DelegateCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;

        /// <summary>
        /// 判斷判斷命令是否可以被執行
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        public bool CanExecute(object parameter)
        {
            if (this.CanExecuteFunc != null)
            {
                this.CanExecuteFunc(parameter);
            }
            else
            {
                return true;
            }
            return false;
        }

        /// <summary>
        /// 執行相關的函數或者命令
        /// </summary>
        /// <param name="parameter"></param>
        public void Execute(object parameter)
        {
            if (this.ExecuteAction != null)
            {
                this.ExecuteAction(parameter);
            }
            else
            {
                return;
            }
        }

        /// <summary>
        /// 聲明一個委託用來執行命令對應的方法
        /// </summary>
        public Action<object> ExecuteAction { get; set; }

        /// <summary>
        /// 聲明一個方法,用來判斷命令是否可以被執行
        /// </summary>
        public Func<object, bool> CanExecuteFunc { get; set; }

    }

DelegateCommand

public class NotificationObject : INotifyPropertyChanged
    {
        /// <summary>
        /// 實現接口
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// 通知屬性的改變
        /// </summary>
        /// <param name="propertyName"></param>
        public void RaisePropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

NotificationObject

UI界面搭建

這裏主要採用第三方開源框架MahApps.Metro,可以通過NuGet方式安裝到項目中,這裏不再展開講解,感興趣的朋友可以參考 MahApps.Metro – Quick Start

OPC相關處理

大致分為如下幾步:

  • 獲取OPC服務列表
  • 連接OPC服務
  • 創建分組
  • 獲取項目列表
  • 添加項目到分組中
  • 對項目的內容進行讀寫操作

比較簡單,不再展開了。

登陸界面

這裏我們說一說登陸界面的實現,由於追求PURE MVVM,所以這裡有三點需要說明一下:

  • PasswordBox綁定
  • 圓形頭像
  • 登陸窗體切換

PasswordBox綁定:自定義幫助類,使用PasswordBoxBehavior實現綁定;

圓形頭像:自定義樣式,增加Image圓角屬性;

登陸窗體切換:藉助prism的shell。

至此,已全部結束。

  作者:Jeremy.Wu
  出處:https://www.cnblogs.com/jeremywucnblog/
  本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

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

【其他文章推薦】

※超省錢租車方案

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

※回頭車貨運收費標準

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

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

聚甘新

Formula E 香港開賽,在地團隊推出新車

由FIA於2012年成立推行的Formula E電動方程式賽車,今年10月8、9日將在香港開賽。香港全城不僅摩拳擦掌準備迎接賽事,一支在地團隊也將展示一輛「100%香港製造」的未來電動概念車。

Formula E的第一場正式賽事於2014年在中國北京舉行,至今已巡迴亞、歐、美洲多個國家,2015-2016賽季的參賽車隊共有九隊。Formula E與正規方程式賽車最大的差別之處,在於所有賽車都是電動車,希望藉此鼓勵電動車技術發展。

香港中環海濱區將於10月8、9日舉辦Formula E本季賽事的其中一場比賽。除了引人注目的賽事之外,賽車場附近的eVillage空間也將展出一輛概念電動車,搭載智能化安全駕駛輔助系統、再生能源、電腦視覺等功能。系統亦可收集交通數據,即時提示交通路況。

這輛概念電動車由香港科學園公司整合九個科技團隊的技術所打造,是香港第一輛100%港產電動車。科學園公司也表示將與香港本地的一家巴士公司合作,研究將電動車計入應用於巴士上,並預計在今年年底推出自動駕駛巴士。

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

【其他文章推薦】

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

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

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

※超省錢租車方案

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

聚甘新

別賜死蘋果車?傳庫克沒死心、擬收購McLaren超跑

先前一度傳出蘋果電動車開發案「泰坦計畫」(Project Titan)胎死腹中,蘋果將放棄硬體,轉向研發自駕車技術。不過新消息顯示,蘋果似乎還沒死心,向英國超跑車商McLaren提親。

巴倫(Barronˋs)、英國金融時報21日報導,內情人士透露,蘋果考慮收購McLaren、或進行策略投資,雙方好幾個月前開始洽談。據了解,蘋果對McLaren的工程技術和專利極感興趣,估計若真要併購McLaren,價格可能為10~15億英鎊。不過相關人士強調,最近蘋果電動車發展方向改變,不確定是否繼續協商。

消息傳出後,McLaren發布聲明,表示未與蘋果討論投資提案,不過沒有說明蘋果是否曾接洽過該公司。

McLaren出面否認,仍然止不住市場議論。Creative Strategies分析師Ben Bajarin以特斯拉和英國超跑Lotus結盟為例,說明可行性。他指出,2004年特斯拉與Lotus合作,發布電動跑車「Tesla Roadster」,定價十萬美元。儘管Roadster賣不到3,000輛,卻替之後的特斯拉暢銷車款「Model S」打下基礎。Bajarin稱,特斯拉從高檔跑車出發,蘋果或許也會如此。

富國銀行(Wells Fargo)的Maynard Um則認為,蘋果看上的不是硬體,而是McLaren的感測器技術。他在報告稱,McLaren超跑聞名於世,但是蘋果青睞的應是旗下的McLaren Applied Technologies部門。McLaren跑車利用偵測器蒐集胎壓、煞車溫度、衝擊力道等資料,透過預測分析,提升汽車維修和表現;此一技術可運用於許多領域,如能源業、健保業等。

紐約時報9月初報導,知情人士透露,蘋果發展電動車計畫,因潛在競爭者眾且技術難度高而大打退堂鼓,策略面臨修正,部分泰坦研發案已提前結案,並連帶資遣數十名工作人員。

蘋果七月請回老將Bob Mansfield主導泰坦計畫,重心從硬體製造移往自駕車應用科技,裁員是策略轉向的一部份。谷歌在更早之前就開始研發自駕車,且已上路測試好幾年,重心同樣放在谷歌最擅長的軟體研發與應用。

本文由嘉實資訊 MoneyDJ 授權使用 記者 陳苓 報導

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

【其他文章推薦】

※超省錢租車方案

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

※回頭車貨運收費標準

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

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

聚甘新

Linux nohup命令詳解,終端關閉程序依然可以在執行!

大家好,我是良許。

在工作中,我們很經常跑一個很重要的程序,有時候這個程序需要跑好幾個小時,甚至需要幾天,這個時候如果我們退出終端,或者網絡不好連接中斷,那麼程序就會被中止。而這個情況肯定不是我們想看到的,我們希望即使終端關閉,程序依然可以在跑。

這時我們就可以使用 nohup 這個命令。

nohup 命令是英語詞組 no hangup 的縮寫,意思是不掛斷,也就是指程序不退出。這個命令會使程序忽略 HUP 信號,保證程序能夠正常進行。HUP 信號有些人可能比較陌生,它是在終端被中止的時候向它所關聯的進程所發出的信號,進程收到這個信號后就會中止運行。所以如果你不希望進程被這個信號幹掉的話,就可以忽略這個信號。而 nohup 命令做的就是這個事情。

本文我們將詳細介紹 nohup 命令的具體用法。

nohup命令基本語法

nohup 命令的基本語法如下:

$ nohup command arguments

或者:

$ nohup options

如果你想要得到更多關於 nohup 的用法介紹,可以查看它的幫助頁面:

$ nohup --help

如果你需要查看它的版本號,可以使用 --version 選項。

$ nohup --version

使用nohup命令啟動一個程序

如果你需要運行一個程序,即使對應的 Shell 被退出后依然保持運行,可以這樣使用 nohup 運行這個程序:

$ nohup command

當這個程序進行起來之後,這個程序對應的 log 輸出及其錯誤日誌都將被記錄在 nohup.out 文件里,這個文件一般位於家目錄或者當前目錄。

重定向程序的輸出

如果我不想把程序的輸出保存在家目錄或者當前目錄,我想保存在我指定的路徑,並且自定義文件名,要怎麼操作?這時我們就可以使用重定向操作 >

比如,我現在有個腳本 myScript.sh 我想把它的輸出保存在家目錄下的 output 目錄下,文件名為 myOutput.txt ,可以這樣運行:

$ nohup ./myScript.sh > ~/output/myOutput.txt

使用nohup命令後台啟動一個程序

如果想讓程序在後台運行,可以加上 & 符號。但這樣運行之後,程序就無影無蹤了。想要讓程序重新回到終端,可以使用 fg 命令。

這個命令的輸出 log 將保存在 nohup.out 文件里,你可以使用 cat 或其它命令查看。第二行里 8699 這個数字代表這個命令對應的進程號,也就是 pid 。我們可以使用 ps 命令來找到這個進程。

使用nohup同時運行多個程序

如果你需要同時跑多個程序,沒必要一個個運行,直接使用 && 符號即可。比如,你想同時跑 mkdir ,ping,ls 三個命令,可以這樣運行:

$ nohup bash -c 'mkdir files &&
ping -c 1 baidu.com && ls'> output.txt

終止跑在後台的進程

上面有提到,nohup 命令結合 & 符號可以使進程在後台運行,即使關閉了終端依然不受影響。這時,如果想要終止這個進程,要怎麼操作呢?

最簡單的當屬 kill 命令,相信大家用過很多次了。

$ kill -9 PID

那要如何找到進程對應的 pid 呢?我們可以使用 ps 命令。

$ ps aux | grep myScript.sh

或者你使用 pgrep 命令也行。

接下來,再使用 kill 命令就可以終止該進程了。

$ kill -9 14942

公眾號:良許Linux

有收穫?希望老鐵們來個三連擊,給更多的人看到這篇文章

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

【其他文章推薦】

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

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

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

※超省錢租車方案

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

聚甘新