印度猴群闖醫學院「毆打研究員」 下秒洗劫待驗的武肺檢體

摘錄自2020年05月30日三立新聞網印度報導

武漢肺炎(COVID-19)仍持續在印度延燒,然29日卻發生一起「搶劫事件」,一群猴子突闖入北方省勒克瑙(Lucknow)一處醫學院、出手攻擊醫事人員,並將多個待檢驗新冠病毒的血液檢體劫走;消息一出,附近居民紛表擔憂,害怕病毒會因檢體洩漏而進一步擴散。

醫學院領導人賈格(S. K. Garg)指出,現在沒有證據顯示人會傳染病毒給猴子,但不知道若猴子接觸有病毒的血液之後,是否會遭受感染。有關單位也表示,目前還沒掌握到猴子是否有把血液灑出來,但附近居民得知消息後,都很擔心若猴子將檢體帶到住宅區,恐會造成病毒擴散。

猴子闖入人類居住區、造成騷亂甚至攻擊人類的事件近來在印度頻傳,環保人士對此表示,主要原因是猴子的棲息地遭破壞,而牠們為了尋找食物才會闖入人類的居住空間。

※ 本文與 行政院農業委員會 林務局   合作刊登

國際新聞
印度
武漢肺炎
猴子
公共衛生
處變不驚──與野生動物相遇
人與動物衝突事件簿

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

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

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

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

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

躲過大火又來疫情 無尾熊面臨斷炊危機

摘錄自2020年05月31日TVBS新聞網澳洲報導

澳洲在去年年底,發生世紀森林大火,至少造成8,000隻無尾熊喪命,沒想到躲過大火,現在澳洲無尾熊卻因為疫情,可能面臨斷炊危機。以澳洲雪梨郊區的野生動物園來說,因為七成以上收入是靠外國觀光客,現在因為疫情根本沒有收入,現在只能期待澳洲政府紓困,才能讓園內50隻無尾熊的飼料費有著落。

費瑟代爾野生動物園公關:「就像大家知道的,夏天的時候,森林大火燒到動物園附近,剛想說逃過一劫,這下沒問題了,結果又遇到新冠病毒疫情。」

這家野生動物園的無尾熊,儘管躲過了大火奪命,如今卻可能因為疫情,面臨斷炊危機,原來每頭無尾熊,每年的飼料費是1萬9000澳幣,現在沒了觀光客,業者只能期待澳洲政府救濟。

生態保育
物種保育
生物多樣性
國際新聞
澳洲
無尾熊
動物與大環境變遷

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

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

※推薦台中搬家公司優質服務,可到府估價

歐企推環保轉型 呼應下一代歐盟計劃

摘錄自2020年05月31日台灣醒報歐洲報導

面對疫情歐洲企業提倡環保轉型,配合歐盟永續發展新計劃。歐洲最大的時裝網購平台Zalando日前宣佈,將要求其合作品牌在2023年前達到永續發展的環保目標。如果不能符合規定將會強制下架該公司所有商品。

目前約有2000個時尚品牌經由Zalando的平台銷售,包括Nike、Gucci、Ted Baker等。各界認為,此舉不僅提升環保意識,也能讓時尚圈有更明確的未來目標。

據《科學人》報導,歐盟日前公佈一項金額高達7500億歐元,名為「下一代歐盟」的經濟復甦計劃,內容特別強調阻止氣候變遷的重要性。歐盟執委會主席馮德萊恩向媒體表示:「我們必須確保企業在疫情期間進行產業轉型時,也要符合環保的大方向。」

環境哲學
生活環境
綠色消費
全球變遷
氣候變遷
循環經濟
國際新聞
歐洲
環境正義

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

【其他文章推薦】

※回頭車貨運收費標準

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

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

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

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

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

能兼顧到家用還開着爽 這幾款車只需要10萬起!

6L、1。8L以及2。0L三款發動機,傳動系統配備5擋手動以及大家最熟悉的CVT變速箱。CVT變速箱動力輸出十分平順,也非常適合在日常城市道路駕馭。硬朗的底盤以及韌性不錯的懸挂,加上ASC車身穩定系統,能給駕駛者足夠的信心。一汽-大眾-速騰指導價:13。

前言

對於80後部分朋友已成家立室,上有老下有小,買車必須要考慮到家用,而心中存在着一份激情,開着也能讓自己爽。所以對於這部分朋友來說,選擇操控好,還能兼顧到家用,也是他們首要的目標。

長安馬自達-馬自達3 Axela昂克賽拉

指導價:11.49-15.99萬

昂克賽拉沿用了馬自達最新“魂動”家族化設計, 前臉造型如同獵豹,視覺感受更加富有攻擊性以及活力的風格,尾部設計較為簡潔,整體設計風格時尚年輕。

內飾正是昂克賽拉的創新所在,雖然簡潔,但整體內飾氛圍更具運動感,車廂做工用料方面,比較厚道!

昂克賽拉更有兩個版本可選,三廂以及兩廂車型,空間方面,能夠滿足日常出行,三廂版/兩廂版行李箱的容積為419L、350L,長途駕駛三廂版實用性更高。

昂克賽拉搭載了1.5L以及2.0L兩款自然吸氣發動機,也是馬自達最新“創馳藍天”發動機,我相信大家也非常了解這款發動機,其優點就是能擁有相對低的油耗還能兼顧到充沛的動力輸出,傳動系統配備了6擋手動、6擋手自一體變速箱。底盤的質感高級,從容紮實,懸挂的調校偏運動,能有很好的操控性還能兼顧舒適性。

東南汽車-翼神

指導價:9.58-13.98萬

翼神外觀採用了三菱經典的鯊魚嘴仿生學造型設計,黑色的大嘴結合成一體,尾部設計較為驚艷,有層次感。翼神整體的設計更加霸氣有力!

翼神內飾主要以黑色為主,中控設計布局簡潔以及在物理按鍵上很到位,整體車廂氛圍很有戰鬥感。

翼神車身長寬高為4570*1760*1490mm,軸距為2635mm,空間表現,寬敞也能輕鬆翹個二郎腿,座椅填充物軟硬適中,包裹性也很足。

動力方面,翼神搭載了1.6L、1.8L以及2.0L三款發動機,傳動系統配備5擋手動以及大家最熟悉的CVT變速箱。CVT變速箱動力輸出十分平順,也非常適合在日常城市道路駕馭。硬朗的底盤以及韌性不錯的懸挂,加上ASC車身穩定系統,能給駕駛者足夠的信心。

一汽-大眾-速騰

指導價:13.18-21.88萬

速騰外觀設計依然還是很大眾,家族式設計並沒有太多的亮點,圓滑的車身造型以及流暢動感線條,速騰依然不失時尚感。

內飾設計依然還是大眾風格,雖然是大眾風格,但其整體設計風格很耐看,甚至會有那麼一絲高級感,做工用料上採用了些許硬質材料,視覺效果並不差,依然簡潔。

速騰車身長寬高為4655*1780*1453mm,軸距為2651mm,空間表現,可以說是速騰最引以為傲的地方,蹺二郎腿毫無壓力。

動力方面,速騰搭載了1.2T、1.4T.1.6T以及2.0T四款發動機,可供消費者選擇較多,傳動系統方面配備5擋手動、6擋手自一體、7擋雙離合變速箱,購買雙離合車型的消費者也無需擔心其的耐用性以及平順性,大眾也做了特別多的優化。底盤依然是大眾一貫的風格調校,紮實,速騰懸挂調校也偏向舒適。

全文總結

整體來說,這三款車都有運動基因的底子,能兼顧到家用以及在操控性方面也不錯,產品力也很強!加上現在優惠幅度也比較大,也值得入手。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

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

都是六萬多,這三個漂亮的、配置高的SUV哪個是你的菜

如果車長真的達到4420mm,軸距也不會只有2510mm。雖然都是“3”,但是瑞虎3和DX3是截然不同的兩種設計風格。DX3走的完全是時尚路線,瑞虎3則成熟穩重許多。沒有改款前的內飾看起來比較過時,如今2016款的造型還說的過去。變得更加有層次感,看起來也年輕許多了。

六萬多的裸車,想買一台不錯的車子,只有考慮自主品牌的車子了,因為這個價位合資車幾乎沒有什麼好的選擇,要麼就是丑到家,要麼就是配置很寒磣。

但是如果選擇自主品牌的話,那麼路一下子就會變得特別寬,可以有很多不錯的選擇,尤其是對於自主品牌密集布局的SUV領域。所以小編選出了下面三台車子,看看哪台是你的菜。

東南汽車-東南DX3

指導價:6.79-10.09萬

DX3的車身尺寸為4354*1840*1670mm,軸距為2610mm,因為DX7的外觀獲得了不少消費者的讚譽,所以這次DX3的設計還是由賓尼法利納設計中心完成。不得不說,DX3的外觀確實比較驚艷,犀利的前臉,凌厲的腰線,懸浮式車頂設計,這一切都讓DX3看起來非常時尚。

內飾和外觀一樣,不僅好看,更重要的是原創性也非常高。據DX3的設計師設計透露,DX3的內飾設計風格為“永恆之美”,反正我也不知道什麼叫做永恆之美,只知道看起來挺時尚的。不過內飾的配色也很豐富,可以提供棕+黑、紅+黑兩種配色。

DX3的空間表現很好,後排空間較為寬裕,在同級別中處於中等偏上的水準。它的動力系統為1.5L 120馬力+5擋手動,1.5T 156馬力+CVT變速箱。其實如果預算比較吃緊的話,1.5L的發動機就可以滿足日常家用了,即使是最低配,也會配備車身穩定系統、胎壓監測、上坡輔助、陡坡緩降、后視鏡電動調節。安全配置和實用配置都有,所以對於資金不充足的消費者來說,低配就夠了。

奇瑞汽車-瑞虎3

指導價:6.89-9.29萬

瑞虎3的車身尺寸為4420*1760*1670mm,軸距為2510mm。不要被數據蒙蔽了,其實虎3的車長是加上那個外掛的備胎了。如果車長真的達到4420mm,軸距也不會只有2510mm。雖然都是“3”,但是瑞虎3和DX3是截然不同的兩種設計風格。DX3走的完全是時尚路線,瑞虎3則成熟穩重許多。

沒有改款前的內飾看起來比較過時,如今2016款的造型還說的過去。變得更加有層次感,看起來也年輕許多了。尤其是中控大屏,可以立馬增加中控的檔次感。

瑞虎3的動力系統為1.6L 126馬力+5擋手動/CVT變速箱。老款的瑞虎3沒有車身穩定系統,遭到了吐槽,現在瑞虎3終於標配了ESp,性價比提升了很多。同時奇瑞的瑞虎系列也有了一定的歷史了,質量還是挺讓人放心的,不管是手動擋還是CVT車型,質量方面都有着比較穩定的表現。

凱翼汽車-凱翼X3

指導價:6.66-9.69萬

凱翼X3的車身尺寸為4335*1796*1665mm,軸距為2530mm。凱翼X3也是小型SUV,車身尺寸在同級別並不佔什麼優勢,雖然凱翼X3的外觀經過了重新的設計,變得年輕時尚許多,但是在車身側面和車尾,仍有一些瑞虎3的影子。

中控內飾極其簡約,沒有什麼複雜的線條做映襯,可以看出來設計師是盡量追求簡介的設計風格,中控台的按鍵數目屈指可數。不過中控台的用料很不錯。部分區域採用了搪塑工藝,手感較好。

凱翼X3的動力系統為1.6L 126馬力+5擋手動/CVT,動力表現和瑞虎3較為相近。其實就配置而言,凱翼X3的配置要低於DX3和瑞虎3的。不過凱翼X3也有着自己的特色,比如更加討人喜歡的外觀。

總結:相對來說DX3和瑞虎3的性價比都很高,配置很實在,DX3的外觀看起來更年輕,瑞虎3則更適合比較穩重的消費者,至於凱翼X3,如果你覺得瑞虎3的外觀有點過於成熟的話,那麼可以看看凱翼X3,雖然它的性價比沒有瑞虎3那麼高。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

※超省錢租車方案

※回頭車貨運收費標準

要是明年別克將這車國產 告訴我你買不買賬?

基於輕量化平台打造后,新君威不僅車重減輕,車身和軸距都相應加長了55mm和92mm,加上車尾採用的溜背設計,未來新君威的後排空間必定提升不少。新君威在未來也有望搭載1。5T/2。0T發動機,其中1。5T車型極有可能搭載7速雙離合變速箱。

相信大家對別克君威都不陌生,這輛中級轎車從以前主打舒適穩重的風格向後期年輕化的運動范轉變。而最近它的姊妹車歐寶Insignia實車也亮相了,新一代君威的外觀基本會與其相同。

可能很多人已經淡忘了歐寶這個品牌,實際上作為通用旗下的子品牌,歐寶、別克和沃克斯豪爾(Vaxuhall)都存在着換標車型。同一款車彼此換上不同的logo,在不同的國家地區發售。

而歐寶Insignia所對應的車型分別是別克的君威和霍頓的Commodore(沒錯,霍頓同樣是通用的子品牌)。這輛未來的新君威走了略帶豪華的運動風格,不論是前臉還是腰線的設計都顯得非常運動,只不過到時進來國產的時候,外觀肯定會有一些調整,而這款Insignia則有可能在明年日內瓦車展發布,而新君威則有望在明年國產。

基於輕量化平台打造后,新君威不僅車重減輕,車身和軸距都相應加長了55mm和92mm,加上車尾採用的溜背設計,未來新君威的後排空間必定提升不少。

新君威在未來也有望搭載1.5T/2.0T發動機,其中1.5T車型極有可能搭載7速雙離合變速箱。只不過在國內眾多消費者對於別克的變速箱印象都很一般,未來國產車型還是得要多花點心思好好調整下了。

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

【其他文章推薦】

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

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

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

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

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

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

※回頭車貨運收費標準

看懂就是省錢!賣一輛車4S店可以賺你多少錢?

汽車廠家整車利潤據網上資料显示,在國內,主流汽車廠家的整車利潤一般在10%左右,這個数字可能大家看了都不相信,因為在中國,很多人都認為汽車廠家是超賺錢的,當然,這10%其實不包括其中零散配件的價格利潤,現在是全球化時代,許多汽車廠家都會和許多知名的汽車配件,發動機和變速箱公司合作,其中這些核心部件在買賣當中究竟是有着多少利潤可言,關於這個問題,汽車廠家則以汽車技術不外露為理由,並沒有公開給我們廣大消費者。

相信大家在買車的時候都相信一個道理,絕大多數的汽車,具有一個官方的廠商指導價,但一般我們在4S店裡購買的話,在這個基礎價格上,還能有着幾千上萬的優惠幅度,放眼全國,也存在着30萬的車降價7萬,20萬的車降價3萬元的情況,降價幅度如此之大,不由得讓人懷疑,這樣子4S店為何還能賺到錢?而且一輛車的成本是有多低?

許多消費者在買車的時候,似乎不會去關注這個問題,認為只要車合適價格滿意,這就達成了購買的協議,但一輛車為何能夠降價這麼多,例如花了20萬元買了台雅閣,其中有多少錢真正屬於這輛車的?繼續往下看。

買一輛車的錢,可以分為5個部分,分別是:稅費,技術轉讓費,汽車廠家整車利潤,4S店利潤,轎車成本。

稅費

廠家需要繳納的稅費:消費稅,增值稅

消費者需要繳納是稅費:購置稅

從網上相關數據的查閱中發現,每一輛車需要繳納的稅收佔著汽車價格的23%左右,消費者購車后繳納10%的車輛購置稅(雖然精準的購置稅算法為發票÷1.17×10%,但我們姑且算個大概),所以這麼一來,一輛車從生產到消費者手中需要繳納的稅收就約佔汽車價格的33%左右。

除此之外,汽車廠家還要繳納教育附加的地方教育費,總費用合計在5%左右,這麼加起來,一輛車從生產出來直到消費者手中,其中所需要的稅費總的加起來就高達38%,稅費真的讓人防不勝防。

技術轉讓費

對於我們國內一些汽車合資品牌來說,每生產出一台合資車,都需要給外方支付10%的技術轉讓費,比如你買了一台20萬的轎車,其中技術轉讓費就高達2萬元,哦我的天,怪不得在同級轎車中,如果購買相同配置的話,合資車總要貴那麼幾萬塊,如此高的技術轉讓費,會導致國外一些價格較低的車型,很難引入國內,畢竟引入后,在價格戰上,始終斗不過寶駿310,或者長安奔奔的。

汽車廠家整車利潤

據網上資料显示,在國內,主流汽車廠家的整車利潤一般在10%左右,這個数字可能大家看了都不相信,因為在中國,很多人都認為汽車廠家是超賺錢的,當然,這10%其實不包括其中零散配件的價格利潤,現在是全球化時代,許多汽車廠家都會和許多知名的汽車配件,發動機和變速箱公司合作,其中這些核心部件在買賣當中究竟是有着多少利潤可言,關於這個問題,汽車廠家則以汽車技術不外露為理由,並沒有公開給我們廣大消費者。

4S店利潤

終於說到大家非常關心的問題了,據數據統計,在30萬元以下的車型,銷售一輛車的平均利潤為5%左右,賣一輛30萬的車4S店的利潤才1.5萬塊?怎麼可能!單純賣車賺的錢肯定不夠一整個4S店的開支(地租,人工費,設備耗損費,水電費),而且據了解,現在很多4S店由於資金不足,所以都把現車的合格證和主鑰匙抵押給銀行去貸款,等到這輛車賣出去了再去銀行贖回來,但也出現過賣車后無力贖回車輛的合格證的情況,導致車主無法按時上牌,所以這麼來說,許多4S店其實單車賣出來賺的利潤不多,主要還是靠拚命地賣車,在年底拿廠家返點。

那麼賣一輛車,4S店如何通過其他方式賺到你的錢呢?

保險費:對於一般人來說,在店裡買車,大多數人還是會在這裏把保險順便買了,方便以後出險的時候,這裏也有保險專員可以幫你跟進車輛的情況,更加方便,服務到位,大部分4S店都要求客戶買車的時候,保險也一定要在本店購買,更離譜的還要求必須買一定金額的保險,買個全險六七千,其中的利潤還是有一兩千的。

上牌費:其實上牌費也就是500塊錢而已,但是在一二線城市例如廣州,上個牌需要收取3000塊錢手續費,且一定要在本店執行,客戶不能夠提裸車,而如果需要上比較偏遠城市的外地牌,手續費去到6000元也有。

精品加裝費:對於一些熱銷車型來說,4S店肯定要大賺一筆,加價加價繼續加價,但是直接加價會影響市場,被稅局查到也有影響,所以都會利用一些其他方式來執行這種加價的“套路”,很簡單,通過一大堆高昂的精品加裝,價值就能夠上到一兩萬元,確實是炒高了價的“淘寶貨”啊。

售後維修服務:雖然說4S店通過正兒八經的方式確實掙不到什麼錢,但是售後服務這個大蛋糕,確實一直讓他們吃得挺爽的,一般新車都規定3個月或者5000公里後進行首保,但是4S店一般會在3000公里的時候,就提醒客戶該過來首保了,雖然說免費,但送的就是服務,且在質保期內如果在其他地方維修出現什麼其他問題,4S店也不承認,所以很多人在質保期內,還是會乖乖地去4S店裡做一下保養,收費可都是外面的好幾倍。

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

【其他文章推薦】

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

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

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

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

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

※回頭車貨運收費標準

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

真的假的?10萬級的國產SUV已經擁有媲美合資的能力了!

東風風神AX5新車指導價:8。97-12。87萬在外觀方面東風風神AX5擁有一個極高的原創外觀,採用了雙橫幅的鍍鉻前格柵,下部進氣口採用梯形設計,同時保險杠兩側還配備有類似進氣口造型的豎條狀LED日間行車燈,此外紅色卡鉗以及使用18寸風火輪式輪轂更能彰顯AX5的運動氣質,而AX5的離地間距達到190mm,處於中上游水準。

合資水平是目前眾多國產車廠商一直追求境界。為什麼總有的人會說國產車追不上合資車型?在看來最主要的原因是個人的感受方面。

國產品牌與合資到底差在哪兒?

品牌影響力上的差距!“國產”“合資”看起來就覺得合資更高端,在這裏也存在一種崇洋媚外的心理。現在的消費者買車更看重面子!國產品牌在眾多人心中依舊是“山寨”“廉價”的代名詞,如果讓親戚朋友看到你開一台國產車,總是會覺得低人一等。在很多人看來,為什麼要買國產車?並不是因為愛過情懷,而是錢不夠。

外觀內飾設計上的差距?認為設計是一種很主觀的東西,但凡有一些比較潮流的設計出現,喜歡的人會被吸引進來,不喜歡的人只會吐槽。所以在汽車設計方面越平庸的車型越受廣大消費者所喜愛,而且中國人更喜歡“大”這一個詞語,於是現在的新款車型在尺寸方面都越做越大。至於合資和國產是否存在差距?覺得現在國產車的設計已經相當不錯,除了那幾個不爭氣堅持模仿的廠商,大多都擁有了自己的一套家族式設計語言,而且原創度都相當高!

行駛質感的差距!有的人說國產車型開上幾年底盤感覺就像要散掉一般,跟合資車型完全無法比較。決定汽車行駛整體的質感與汽車廠家的調校功力成正比關係,就像法系車能把扭力梁調得比你的獨立懸挂更牛逼一樣,幾乎所有的廠家將自己那套底盤數據當成國家機密一樣。而調校就是國產品牌的硬傷,有能力的國產品牌可以選擇直接向合資廠家買比較過時的底盤數據、或者直接給錢外包給國外的調校團隊,投入資金是相龐大的。說句難聽點的,有部分的國產廠商的車型在看來壓根就是跳過了“調校”這個步驟。

國產品牌就這麼菜?

其實並不是,相反10萬左右的購車預算,選擇國產車型性價比更高!首先是配置更高、而且車子比合資車型更為大氣!有的人說國產車質量不行,國產車型的故障率是稍高,但這是對於故障率極低的品牌而言(就像豐田這些),不是所有的合資品牌故障率都很低的!10年前的國產車都在路上跑着,也不要說現在的新車型了。

外觀夠大氣、配置夠高、內飾檔次夠高、車型質量過關!是判斷一台國產車型能否擁有與合資車競爭的最主要因素!

東風風神AX5

新車指導價:8.97-12.87萬

在外觀方面東風風神AX5擁有一個極高的原創外觀,採用了雙橫幅的鍍鉻前格柵,下部進氣口採用梯形設計,同時保險杠兩側還配備有類似進氣口造型的豎條狀LED日間行車燈,此外紅色卡鉗以及使用18寸風火輪式輪轂更能彰顯AX5的運動氣質,而AX5的離地間距達到190mm,處於中上游水準。

中控台設計層次感挺高,採用了軟性材料覆蓋給到的質感也非常不錯,而且最讓喜歡的是它的實用性配置上,像副駕駛地下的鞋盒給愛穿高跟鞋的女生提供了放鞋的地方、配備了獨立的8英寸液晶屏和一鍵啟動等配置,內置的Windlink系統支持與安卓手機的連接。

AX5提供1.4T渦輪增壓發動機,與之匹配的是一台5擋手動/6擋擋雙離合,在質量方面值得肯定,另外AX5的底盤平台源自東風與pSA集團共同研發的DF2平台,在行駛質感方面真心不錯。

榮威RX5

新車指導價:9.98-18.68萬

榮威RX5在上市之初一直以“網紅”的形式登場,極高的顏值受到廣泛消費者的關注,作為榮威“律動設計”理念下的首款車型,“展翼格柵”的中控與矩陣式LED大燈相連,整體造型時尚大氣,原創度極高,逼格十足。

採用黃金比例進行打造設計的中控台也是滿滿的逼格,大面積使用軟材料包裹,摸到哪兒都是軟的,中控10.4英寸的大显示屏更是成為了中控台的點睛之筆,整體給人的質感相當高檔。另外與阿里共同打造出來的車載互聯繫統更是將其“網紅”的定位推上了頂峰。

在動力方面,1.5T的動力更適合家用、2.0T的動力能帶給你非常不俗的駕駛樂趣,在質量方面,榮威背後有着通用這個大集團的撐腰,無論在品控還是質量方面都值得肯定。

合資的选手實力也不俗!

雪鐵龍C3-XR

新車指導價:10.88-17.18萬

法系車一直不被人看好,車頭採用了更多平直的線條,彰顯飽滿風格。大燈簡單耐看,內部線條與前格柵相連接,整體感更強。而側面的線條緊湊動感,不規則的輪圈樣式也頗為個性。儘管它擁有着同級領先的底盤調校技術,但是配置搭配不合理是它主要的缺點,不過法系車也就有一個優點:那就是底盤紮實好開。

現代ix25

新車指導價:11.98-18.68萬

韓國車一直以高顏值作為賣點,所以無論旗下哪款車型,無疑不是顏值極高的选手,當然韓系車另外一個賣點就是配置比同級別的合資車型配置更高,而且韓系車在終端優惠方面很大,所以在新車落地價上會比較便宜。也可以這麼說,現代ix25在實用性與家用兩方面是做得相當不錯的。

國產車型配置高、價格更低,性價比十足。很多人對國產車存在偏見,但是這個困境將會隨着國產車型的日益發展得到改善,如果國產車的整體質量上來了,你還會覺得國產車比不上合資嗎?本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

※回頭車貨運收費標準

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

基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(一)

系列文章

  1. 基於 abp vNext 和 .NET Core 開發博客項目 – 使用 abp cli 搭建項目
  2. 基於 abp vNext 和 .NET Core 開發博客項目 – 給項目瘦身,讓它跑起來
  3. 基於 abp vNext 和 .NET Core 開發博客項目 – 完善與美化,Swagger登場
  4. 基於 abp vNext 和 .NET Core 開發博客項目 – 數據訪問和代碼優先
  5. 基於 abp vNext 和 .NET Core 開發博客項目 – 自定義倉儲之增刪改查
  6. 基於 abp vNext 和 .NET Core 開發博客項目 – 統一規範API,包裝返回模型
  7. 基於 abp vNext 和 .NET Core 開發博客項目 – 再說Swagger,分組、描述、小綠鎖
  8. 基於 abp vNext 和 .NET Core 開發博客項目 – 接入GitHub,用JWT保護你的API
  9. 基於 abp vNext 和 .NET Core 開發博客項目 – 異常處理和日誌記錄
  10. 基於 abp vNext 和 .NET Core 開發博客項目 – 使用Redis緩存數據
  11. 基於 abp vNext 和 .NET Core 開發博客項目 – 集成Hangfire實現定時任務處理
  12. 基於 abp vNext 和 .NET Core 開發博客項目 – 用AutoMapper搞定對象映射
  13. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(一)
  14. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(二)
  15. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(三)
  16. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(一)
  17. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(二)
  18. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(三)
  19. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(四)
  20. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(五)

前言

從今天開始將使用 Blazor 完成博客的前端開發,如果你不了解 Blazor ,建議你還是去微軟官網學習學習基礎知識。本篇不做普及,因為這是實戰系列,重點是完成項目開發。

還有,在開始 Blazor 實戰之前,建議動手完成之前的系列文章,這樣更有連貫性,不至於懵圈。

因為我也是第一次使用 Blazor 開發項目,所以無法保證代碼的最優性,如果有不對的地方,或者有更好的做法,歡迎大家指正,謝謝。

接下來,我將現學現做帶來一個完整的博客項目,來吧,Just do it 。

我這裏選擇的是 Blazor WebAssembly,需要你有 .NET Core 3.1 的開發環境,並且你還要有 Visual Studio 2019 IDE。

給大家看看我的開發環境,終端工具是:Window Terminal ,配置一下用起來太爽了,五星強烈推薦。

搭建

Blazor WebAssembly 是一個單頁應用框架,可用它通過 .NET 生成交互式客戶端 Web 應用。 Blazor WebAssembly 使用開放的 Web 標準(沒有插件或代碼轉換),適用於移動瀏覽器等各種新式 Web 瀏覽器。

不啰嗦了,直接開干吧,在項目中新建 Blazor Web 應用。

然後將項目設置為啟動項目,Ctrl+F5 運行一下看看,官網默認示例我這裏也懶得說了,直接進入主題吧。

改造

我這裏使用的UI還是我目前博客的樣式,你可以選擇任意你喜歡的UI界面,這部分就隨意了,不是本實戰系列的重點,所以有關樣式這些東西我就直接 Ctrl CV 了。

替換下面css代碼到 wwwroot/css/app.css 中。

點擊查看代碼

*,
*:after,
*:before {
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
}

html {
	line-height: 1.15;
	-webkit-text-size-adjust: 100%;
}

body {
	margin: 0;
}

h1 {
	font-size: 2em;
	margin: 0.67em 0;
}

hr {
	box-sizing: content-box;
	height: 0;
	overflow: visible;
}

pre {
	font-family: monospace, monospace;
	font-size: 1em;
}

a {
	background-color: transparent;
}

abbr[title] {
	border-bottom: none;
	text-decoration: underline;
	text-decoration: underline dotted;
}

b,
strong {
	font-weight: bolder;
}

code,
kbd,
samp {
	font-family: monospace, monospace;
	font-size: 1em;
}

small {
	font-size: 80%;
}

sub,
sup {
	font-size: 75%;
	line-height: 0;
	position: relative;
	vertical-align: baseline;
}

sub {
	bottom: -0.25em;
}

sup {
	top: -0.5em;
}

img {
	border-style: none;
}

button,
input,
optgroup,
select,
textarea {
	font-family: inherit;
	font-size: 100%;
	line-height: 1.15;
	margin: 0;
}

button,
input {
	overflow: visible;
}

button,
select {
	text-transform: none;
}

button,
[type="button"],
[type="reset"],
[type="submit"] {
	-webkit-appearance: button;
}

button::-moz-focus-inner,
    [type="button"]::-moz-focus-inner,
    [type="reset"]::-moz-focus-inner,
    [type="submit"]::-moz-focus-inner {
	border-style: none;
	padding: 0;
}

button:-moz-focusring,
    [type="button"]-moz-focusring,
    [type="reset"]-moz-focusring,
    [type="submit"]-moz-focusring {
	outline: 1px dotted ButtonText;
}

fieldset {
	padding: 0.35em 0.75em 0.625em;
}

legend {
	box-sizing: border-box;
	color: inherit;
	display: table;
	max-width: 100%;
	padding: 0;
	white-space: normal;
}

progress {
	vertical-align: baseline;
}

textarea {
	overflow: auto;
}

[type="checkbox"],
[type="radio"] {
	box-sizing: border-box;
	padding: 0;
}

[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
	height: auto;
}

[type="search"] {
	-webkit-appearance: textfield;
	outline-offset: -2px;
}

    [type="search"]::-webkit-search-decoration {
	-webkit-appearance: none;
}

::-webkit-file-upload-button {
	-webkit-appearance: button;
	font: inherit;
}

details {
	display: block;
}

summary {
	display: list-item;
}

template {
	display: none;
}

[hidden] {
	display: none;
}

@font-face {
	font-family: 'Fira Code Medium';
    src: url('https://static.meowv.com/fonts/FiraCode-Medium.woff2') format('woff2'), url("https://static.meowv.com/fonts/FiraCode-Medium.woff") format("woff");
    font-weight: 500;
    font-style: normal;
}

html {
	font-family: 'Fira Code Medium', Microsoft Yahei, monospace;
	overflow-x: hidden;
}

html::-webkit-scrollbar {
	width: 5px;
	height: 5px;
}

html::-webkit-scrollbar-thumb {
	height: 20px;
	background-color: #5A9600;
}

html::-webkit-scrollbar-thumb:hover {
	background-color: #5A9600;
}

body {
	font-size: 11pt;
	font-weight: normal;
	line-height: 2em;
	background-color: #fff;
	color: #161209;
	transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, opacity 0.2s ease;
}

body:before {
	content: "";
	background-repeat: no-repeat;
	background-position: center;
	opacity: 0.05;
	position: fixed;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	z-index: -1;
}

body.dark-theme {
	background-color: #292a2d;
	color: #a9a9b3;
	transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, opacity 0.2s ease;
}

a {
	color: #161209;
	text-decoration: none;
	transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, opacity 0.2s ease;
	cursor: pointer;
}

a:hover {
	color: #5A9600;
	text-decoration: none;
	transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, opacity 0.2s ease;
}

.dark-theme a {
	color: #a9a9b3;
	text-decoration: none;
	transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, opacity 0.2s ease;
}

.dark-theme a:hover {
	color: #fff;
	text-decoration: none;
	transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, opacity 0.2s ease;
}

.wrapper {
	display: flex;
	flex-direction: column;
	min-height: 100vh;
	width: 100%;
}

.navbar {
	height: 4rem;
	line-height: 4rem;
	width: 100%;
}

.navbar .container {
	width: auto;
	max-width: 1200px;
	text-align: center;
	margin: 0 auto;
	display: flex;
	justify-content: space-between;
}

.main {
	flex-grow: 1;
	flex-shrink: 0;
	flex-basis: auto;
}

.container {
	padding-left: 1em;
	padding-right: 1em;
}

.footer {
	width: 100%;
	text-align: center;
}


/*input css begin*/

* {
	-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}

input[type="checkbox"],
input[type="radio"] {
	display: none;
	width: 0;
	height: 0;
	visibility: hidden;
}

input[type="checkbox"]:checked + label:after {
	transition: all 0.3s ease-in;
}

input[type="checkbox"]:not(:checked) + label:after {
	transition: all 0.3s ease-out;
}

input[type="checkbox"]:checked + label,
    input[type="checkbox"]:not(:checked) + label {
	transition: all 0.3s ease-in-out;
}

input[type="checkbox"]:checked + label:before,
        input[type="checkbox"]:checked + label i:before,
        input[type="checkbox"]:not(:checked) + label i:before,
        input[type="checkbox"]:checked + label i:after,
        input[type="checkbox"]:not(:checked) + label i:after,
        input[type="checkbox"]:not(:checked) + label:before {
	transition: all 0.3s ease-in-out;
}

input[type="radio"]:checked + label:after,
    input[type="radio"]:not(:checked) + label:after {
	transition: all 0.3s ease-in-out;
}

.switch_default + label {
	background-color: #e6e6e6;
	border-radius: 7px;
	cursor: pointer;
	display: inline-block;
	height: 14px;
	position: relative;
	box-shadow: 0.2px 0.2px 1px 0.5px rgb(180, 180, 180);
	width: 30px;
}

.switch_default + label:after {
	background-color: #fff;
	border-radius: 50%;
	content: "";
	height: 12px;
	left: 1px;
	position: absolute;
	top: .5px;
	width: 12px;
	box-shadow: 0.2px 0.2px 1px 0.5px rgb(180, 180, 180);
}

.switch_default:checked + label {
	background-color: #1ABC9C;
	box-shadow: none;
}

.switch_default:checked + label:after {
	left: 17px;
}

@font-face {
	font-family: "iconfont";
    src: url('//at.alicdn.com/t/font_1313145_r9szngeugmj.eot?t=1566619028667'); /* IE9 */
    src: url('//at.alicdn.com/t/font_1313145_r9szngeugmj.eot?t=1566619028667#iefix') format('embedded-opentype'), /* IE6-IE8 */
    url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), url('//at.alicdn.com/t/font_1313145_r9szngeugmj.woff?t=1566619028667') format('woff'), url('//at.alicdn.com/t/font_1313145_r9szngeugmj.ttf?t=1566619028667') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
    url('//at.alicdn.com/t/font_1313145_r9szngeugmj.svg?t=1566619028667#iconfont') format('svg'); /* iOS 4.1- */
}

.iconfont {
	font-family: "iconfont" !important;
	font-size: 16px;
	font-style: normal;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.iconread:before {
	content: "\e742";
}

.iconweixin:before {
	content: "\e632";
}

.iconmanage:before {
	content: "\e610";
}

.iconapi:before {
	content: "\e668";
}

.iconcode:before {
	content: "\e654";
}

.icongithub:before {
	content: "\ea0a";
}

.iconnotes:before {
	content: "\e687";
}

.header-logo a {
	padding: 0;
}

.navbar .menu a {
	padding: 0 8px;
}

.navbar .menu .active {
	font-weight: 900;
	color: #161209;
}

.dark-theme .navbar .menu .active {
	color: #fff;
}

.navbar-header a:hover,
.navbar .menu a:hover {
	background-color: transparent;
}

header label {
	margin-left: 15px;
	position: relative;
	-webkit-transform: translateY(0.1em) translateX(0.5em);
}

.copyright {
	font-size: 14px;
}

.pagination {
	display: flex;
	flex-direction: row;
	justify-content: center;
	list-style: none;
	white-space: nowrap;
	width: 100%;
	padding-top: 2em;
}

.pagination a,
    .pagination span {
	-webkit-font-smoothing: antialiased;
	font-size: 12px;
	color: #bfbfbf;
	letter-spacing: 0.1em;
	font-weight: 700;
	padding: 5px 5px;
	text-decoration: none;
	transition: 0.3s;
}

.pagination .page-number {
	padding-bottom: 3px;
	margin: 0 20px;
	box-sizing: border-box;
	position: relative;
	display: inline;
}

.pagination .page-number.disabled {
	display: none;
}

.pagination .page-number:hover a {
	color: #000;
}

.dark-theme .pagination .page-number:hover a {
	color: #fff;
}

.pagination .page-number:before,
.pagination .page-number:after {
	position: absolute;
	content: "";
	width: 0;
	height: 1px;
	background: #000;
	transition: 0.3s;
	bottom: 0px;
}

.dark-theme .pagination .page-number:before,
.dark-theme .pagination .page-number:after {
	background: #fff;
}

.pagination .page-number:before .current,
.pagination .page-number:after .current {
	width: 100%;
}

.pagination .page-number:before {
	left: 50%;
}

.pagination .page-number:after {
	right: 50%;
}

.pagination .page-number:hover:before,
.pagination .page-number:hover:after {
	width: 50%;
}

.pagination .page-number.current {
	color: #000;
}

.dark-theme .pagination .page-number.current {
	color: #fff;
}

.pagination .page-number.current:before,
.pagination .page-number.current:after {
	width: 60%;
}

.intro {
	transform: translateY(20vh);
	text-align: center;
}

.intro .avatar {
	padding: 10px;
}

.intro .avatar img {
	width: 128px;
	height: auto;
	display: inline-block;
	-webkit-border-radius: 100%;
	border-radius: 100%;
	-webkit-box-shadow: 0 0 0 0.3618em rgba(0, 0, 0, 0.05);
	box-shadow: 0 0 0 0.3618em rgba(0, 0, 0, 0.05);
	margin: 0 auto;
	-webkit-transition: all ease 0.4s;
	-moz-transition: all ease 0.4s;
	-o-transition: all ease 0.4s;
	transition: all ease 0.4s;
	cursor: pointer;
}

.intro .avatar img:hover {
	position: relative;
	-webkit-transform: translateY(-0.75em);
	-moz-transform: translateY(-0.75em);
	-ms-transform: translateY(-0.75em);
	-o-transform: translateY(-0.75em);
	transform: translateY(-0.75em);
	cursor: pointer;
}

.nickname {
	font-size: 2em;
	font-weight: normal;
}

.links a {
	padding: 0 5px;
}

.links a:hover {
	background-color: transparent;
}

.links .iconfont {
	font-size: 2em;
}

.post-wrap {
	position: relative;
	width: 100%;
	max-width: 1024px;
	margin: 0 auto;
	padding-top: 2rem;
}

.archive-item-date {
	float: right;
	text-align: right;
	color: #a9a9b3;
}

.dark-theme .archive-item-date {
	color: #87878d;
}

.post-wrap .categories-card {
	margin: 0 auto;
	margin-top: 1em;
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-direction: row;
	flex-wrap: wrap;
	padding: 0 2.5em;
	line-height: 1.6em;
}

.post-wrap .categories-card .card-item {
	font-size: 14px;
	text-align: left;
	width: 50%;
	display: flex;
	align-items: flex-start;
	position: relative;
}

.post-wrap .categories-card .card-item .categories {
	overflow: hidden;
}

.categories h3 {
	display: inline-block;
}

.categories span {
	float: right;
	padding-right: 1em;
}

.categories .more-post-link {
	float: right;
}

.tag-cloud-tags {
	margin: 10px 0;
	padding-top: 2em;
}

.tag-cloud-tags a {
	display: inline-block;
	position: relative;
	margin: 5px 10px;
	word-wrap: break-word;
	transition-duration: 0.3s;
	transition-property: transform;
	transition-timing-function: ease-out;
}

.tag-cloud-tags a:active,
        .tag-cloud-tags a:focus,
        .tag-cloud-tags a:hover {
	color: #5A9600;
	transform: scale(1.1);
}

.dark-theme .tag-cloud-tags a:active,
.dark-theme .tag-cloud-tags a:focus,
.dark-theme .tag-cloud-tags a:hover {
	color: #fff;
}

.tag-cloud-tags a small {
	margin: 0 0.3em;
	color: #a9a9b3;
}

.dark-theme .tag-cloud-tags a small {
	color: #fff;
}

.page {
	padding-top: 0;
}

.page .post-content {
	margin: 0;
	padding-top: 0;
}

.post-wrap p {
	font-size: 1em;
	margin: 0.5em 0 0.5em 0;
}

.post-wrap .post-header h1 {
	margin: 0 !important;
}

.post-wrap .post-title {
	font-size: 2em;
	line-height: 1.5em;
}

.post-wrap .eror-tip {
	text-align: center;
	line-height: 1.5em;
	margin-top: 250px;
}

.post-wrap .post-meta {
	color: rgba(85, 85, 85, 0.529) !important;
}

.dark-theme .post-wrap .post-meta {
	color: #87878d !important;
}

.post-wrap .post-meta a {
	color: #000;
}

.dark-theme .post-wrap .post-meta a {
	color: #eee;
}

.post-wrap .post-meta a:hover {
	color: #5A9600;
}

.dark-theme .post-wrap .post-meta a:hover {
	color: #fff;
}

.post-content {
	padding-top: 2rem;
	text-align: justify;
}

.post-copyright {
	margin-top: 5rem;
	border-top: 1px solid #e8e8e8;
	border-bottom: 1px solid #e8e8e8;
}

.post-copyright a {
	color: #000;
}

.dark-theme .post-copyright a {
	color: #eee;
}

.post-copyright a:hover {
	color: #5A9600;
}

.dark-theme .post-copyright a:hover {
	color: #fff;
}

.post-copyright .copyright-item {
	margin: 5px 0;
}

.post-copyright .lincese {
	font-weight: bold;
}

.dark-theme .post-copyright {
	border-top: 1px solid #909196;
	border-bottom: 1px solid #909196;
}

.post-tags {
	padding: 1rem 0 1rem;
	display: flex;
	justify-content: space-between;
}

.post-nav:before,
.post-nav:after {
	content: " ";
	display: table;
}

.post-nav a.prev,
.post-nav a.next {
	font-weight: 600;
	font-size: 16px;
	transition-property: transform;
	transition-timing-function: ease-out;
	transition-duration: 0.3s;
}

.post-nav a.prev {
	float: left;
}

.post-nav a.prev::before {
	content: "<";
	margin-right: 0.5em;
}

.post-nav a.prev:hover {
	transform: translateX(-4px);
}

.post-nav a.next {
	float: right;
}

.post-nav a.next::after {
	content: ">";
	margin-left: 0.5em;
}

.post-nav a.next:hover {
	transform: translateX(4px);
}

.post-nav a.prev::before,
    .post-nav a.next::after {
	font-weight: bold;
}

.tag:not(:last-child) a::after {
	content: " / ";
}

@media only screen and (min-device-width: 320px) and (max-device-width: 1024px) {
	.main {
		padding-top: 40pt;
	}

	.navbar {
		display: none;
	}

	.navbar-mobile {
		display: block !important;
		position: fixed;
		width: 100%;
		z-index: 100;
		transition: all 0.6s ease 0s;
	}

	.navbar-mobile .container {
		padding: 0;
		margin: 0;
		line-height: 5.5em;
		background: #fff;
	}

	.navbar-mobile .container .navbar-header {
		display: flex;
		justify-content: space-between;
		align-items: center;
		width: 100%;
		padding-right: 1em;
		padding-left: 1em;
		box-sizing: border-box;
		position: relative;
	}

	.navbar-mobile .container .navbar-header .menu-toggle {
		cursor: pointer;
		line-height: 5.5em;
		padding: auto 2em;
	}

	.navbar-mobile .container .navbar-header .menu-toggle span {
		display: block;
		background: #000;
		width: 36px;
		height: 2px;
		-webkit-border-radius: 3px;
		-moz-border-radius: 3px;
		border-radius: 3px;
		-webkit-transition: 0.25s margin 0.25s, 0.25s transform;
		-moz-transition: 0.25s margin 0.25s, 0.25s transform;
		transition: 0.25s margin 0.25s, 0.25s transform;
	}

	.dark-theme .navbar-mobile .container .navbar-header .menu-toggle span {
		background: #a9a9b3;
	}

	.navbar-mobile .container .navbar-header .menu-toggle span:nth-child(1) {
		margin-bottom: 8px;
	}

	.navbar-mobile .container .navbar-header .menu-toggle span:nth-child(3) {
		margin-top: 8px;
	}

	.navbar-mobile .container .navbar-header .menu-toggle.active span {
		-webkit-transition: 0.25s margin, 0.25s transform 0.25s;
		-moz-transition: 0.25s margin, 0.25s transform 0.25s;
		transition: 0.25s margin, 0.25s transform 0.25s;
	}

	.navbar-mobile .container .navbar-header .menu-toggle.active span:nth-child(1) {
		-moz-transform: rotate(45deg) translate(4px, 6px);
		-ms-transform: rotate(45deg) translate(4px, 6px);
		-webkit-transform: rotate(45deg) translate(4px, 6px);
		transform: rotate(45deg) translate(4px, 6px);
	}

	.navbar-mobile .container .navbar-header .menu-toggle.active span:nth-child(2) {
		opacity: 0;
	}

	.navbar-mobile .container .navbar-header .menu-toggle.active span:nth-child(3) {
		-moz-transform: rotate(-45deg) translate(8px, -10px);
		-ms-transform: rotate(-45deg) translate(8px, -10px);
		-webkit-transform: rotate(-45deg) translate(8px, -10px);
		transform: rotate(-45deg) translate(8px, -10px);
	}

	.navbar-mobile .container .menu {
		text-align: center;
		background: #fff;
        /*border-top: 1px solid #000;*/
		padding-top: 1em;
		padding-bottom: 1em;
		display: none;
		box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1), 0px 4px 8px rgba(0, 0, 0, 0.1);
	}

	.navbar-mobile .container .menu a {
		display: inline-block;
		margin: 0 1em;
		line-height: 2.5em;
	}

	.navbar-mobile .container .menu.active {
		display: block;
		white-space: nowrap;
		box-sizing: border-box;
		overflow-x: auto;
	}

	.dark-theme .navbar-mobile .container .menu {
		background: #292a2d;
        /*border-top: 1px solid #87878d;*/
	}

	.dark-theme .navbar-mobile .container {
		background: #292a2d !important;
	}

	.archive {
		width: 90%;
	}

	.archive .archive-item .archive-item-date {
		display: none;
	}

	#dynamic-to-top {
		display: none !important;
	}

	.footer {
		height: 3rem;
		width: 100%;
		text-align: center;
		line-height: 1.5rem;
		padding-top: 2em;
	}

	.post-warp {
		padding-top: 6em;
	}

	.post-warp .archive-item-date {
		display: none;
	}

	.categories .categories-card .card-item {
		width: 100%;
		display: flex;
		min-height: 0;
	}

	.categories .categories-card .card-item .categories {
		overflow: hidden;
	}

	.signature-img {
		width: 100%;
	}

	.signature-box img {
		height: 100px !important;
	}

	.signature-img img {
		height: 100px;
	}

	.signature-action, .vip-action {
		width: 100%;
	}

	.signature-action select, .vip-action select {
		width: 100%;
	}

	.signature-action input, .vip-action input {
		width: 200px;
		float: left;
		margin-top: 5px;
	}

	.signature-action button, .vip-action button {
		width: 200px;
		margin-top: 5px;
	}

	.mta-box {
		width: 100% !important;
	}

	.mta-a ul li {
		width: 100% !important;
	}

	.navbar-mobile {
		display: none;
	}
}

@media only screen and (min-device-width: 768px) {
	.navbar-mobile {
		display: none;
	}
}

@media only screen and (min-width: 1024px) {
	.navbar-mobile {
		display: none;
	}
}

.loader {
	box-sizing: content-box;
	display: block;
	position: absolute;
	top: 50%;
	left: 50%;
	margin: 0;
	text-align: center;
	z-index: 1000;
	-webkit-transform: translateX(-50%) translateY(-50%);
	transform: translateX(-50%) translateY(-50%);
}

.loader:before {
	position: absolute;
	content: '';
	top: 0;
	left: 50%;
	width: 50px;
	height: 50px;
	margin: 0 0 0 -25px;
	border-radius: 50px;
	border: 4px solid rgba(0, 0, 0, .1);
}

.loader:after {
	position: absolute;
	content: '';
	top: 0;
	left: 50%;
	width: 50px;
	height: 50px;
	margin: 0 0 0 -25px;
	animation: loader .6s linear;
	animation-iteration-count: infinite;
	border-radius: 50px;
	border: 4px solid transparent;
	border-top-color: #767676;
	box-shadow: 0 0 0 1px transparent;
}

@keyframes loader {
	from {
		-webkit-transform: rotate(0deg);
		transform: rotate(0deg);
	}

	to {
		-webkit-transform: rotate(360deg);
		transform: rotate(360deg);
	}
}

.dark-theme .post-content {
	background: #292a2d !important;
	color: #eee !important;
}

.dark-theme .post-content p code, .dark-theme .post-content ul li code {
	background: #292a2d !important;
}

.apps {
	color: red;
	font-weight: bold;
}

.signature-box {
	margin-top: 100px;
	text-align: center;
}

.signature-box img {
	border: none;
	height: 145px;
	margin-bottom: 50px;
}

.signature-action select, .vip-action select {
	height: 30px;
}

.signature-action input, .vip-action input {
	height: 25px;
	padding-left: 5px;
}

.signature-action input:focus, .vip-action input:focus {
	outline: none;
}

.signature-action button, .vip-action button {
	width: 135px;
	height: 30px;
}

.tag-cloud-tags-extend {
	padding-top: 0;
}

.hidden {
	display: none;
}

.vip-action {
	text-align: center;
}

.imgbox {
	width: 70%;
	text-align: center;
	margin: 80px auto 0;
}

.imgbox img {
	max-width: 100%;
	max-height: 100%;
}

.girl-qrcode {
	text-align: center;
}

.girl-img {
	width: 20%;
}

.btnbox {
	text-align: center;
	margin-top: 20px;
}

.tab-box {
	margin: 0 auto;
	margin-top: 50px;
	width: 1150px;
}

.top-tab {
	font-weight: bold;
	float: left;
	margin-top: 5px;
}

.top-tab ul li {
	list-style: none;
}

.top-tab ul li a.archive {
	color: #5A9600;
}

.top-content {
	float: left;
}

.top-content ul li {
	list-style: none;
	height: 35px;
	line-height: 35px;
	width: 888px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.mta-box {
	width: 75%;
	margin: 100px auto 0;
}

.mta-a {
	margin: 20px 68px 50px 20px;
}

.mta-a ul {
	width: auto;
	display: none;
}

.mta-a ul li {
	float: left;
	width: 25%;
	list-style: none;
}

.mta-a-item {
	margin: 0 10px;
	border: 1px solid #e1e1e1;
	background: #fff;
	min-height: 60px;
}

.mta-a-title {
	padding: 16px 16px 0;
	height: 20px;
	line-height: 20px;
}

.mta-a-value {
	height: 100%;
	font-size: 30px;
	height: 24px;
	margin: 20px 0 20px 30px;
}

.mta-date {
	text-align: right;
	padding-right: 5px;
}

.dark-theme .mta-a-item {
	border: 1px solid #a9a9b3;
	background: transparent;
}

.qrcode {
	width: 120px;
	z-index: 99999;
	opacity: 0.8;
	margin: 20px auto 0;
}

.qrcode img {
	width: 100%;
}

.soul {
	text-align: center;
	margin-top: 200px;
}

.soul-btn {
	background-color: #5a9600;
	border: 5px;
	color: white;
	padding: 15px 32px;
	text-align: center;
	text-decoration: none;
	display: inline-block;
	font-size: 16px;
	margin: 4px 2px;
	cursor: pointer;
	-webkit-transition-duration: 0.4s;
	transition-duration: 0.4s;
}

.soul-btn:hover {
	box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);
}

在css中用到了開源的 FiraCode 字體,可以自己去下載,不過在css中我已經改為遠程地址了。

刪掉 wwwroot/sample-data、wwwroot/css/bootstrap、wwwroot/css/open-iconic 三個文件夾。

在wwwroot文件夾下,有一個index.html,這個是我們網站的入口,注意裏面有一對標籤:<app>Loading...</app>,這個標籤裏面的內容會在 wasm 加載完畢后自動清除掉,所以,一般可以用來做加載提示。

現在改造一下index.html,代碼如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
    <meta name="keywords" content="Meowv,qix,阿星Plus,個人博客">
    <meta name="description" content="阿星Plus的個人博客,用於發表原創文章,關注微信公眾號:『阿星Plus』了解更多。">
    <title>阿星Plus⭐⭐⭐</title>
    <base href="/" />
    <link href="css/app.css" rel="stylesheet" />
</head>

<body>
    <app>
        <div class="loader"></div>
    </app>
    <script src="_framework/blazor.webassembly.js"></script>
</body>

</html>

千萬注意,blazor.webassembly.js 這個js不可以刪除,會在項目打包后自動生成這個js文件。

然後我們一點一點完善,Program.cs默認就行暫時不需要做任何改動。

Pages文件夾內的Razor組件就是我們的具體頁面了,幹掉默認的Counter.razorFetchData.razor,留下Index.razor,當作我們的首頁。

Shared文件夾內可以放一些共享的組件,比如我們的模板MainLayout.razor就在裏面,它需要繼承LayoutComponentBase

所以現在可以來修改一下我們的模板內容。

以我博客的UI架構而言,博客分為了三個部分,頭部、尾部、內容。

@inherits LayoutComponentBase

<div class="wrapper">
    <Header />
    @Body
    <Footer />
</div>

@Body為固定語法,表示這裡是內容部分,其他的不變,只在這裏填充內容。

在Shared文件夾中添加兩個組件,頭部:Header.razor、尾部:Footer.razor

Header.razor的內容如下:

<!-- Header.razor -->
<header>
    <nav class="navbar">
        <div class="container">
            <div class="navbar-header header-logo">
                <NavLink class="menu-item" href="/" Match="NavLinkMatch.All">
                    阿星Plus
                </NavLink>
            </div>
            <div class="menu navbar-right">
                <NavLink class="menu-item" href="posts">Posts</NavLink>
                <NavLink class="menu-item" href="categories">Categories</NavLink>
                <NavLink class="menu-item" href="tags">Tags</NavLink>
                <NavLink class="menu-item apps" href="apps">Apps</NavLink>
                <input id="switch_default" type="checkbox" class="switch_default" />
                <label for="switch_default" class="toggleBtn"></label>
            </div>
        </div>
    </nav>
    <nav class="navbar-mobile">
        <div class="container">
            <div class="navbar-header">
                <div>
                    <NavLink class="menu-item" href="" Match="NavLinkMatch.All">阿星Plus</NavLink>
                    <NavLink >&nbsp;·&nbsp;Light</NavLink>
                </div>
                <div class="menu-toggle">&#9776; Menu</div>
            </div>
            <div class="menu">
                <NavLink class="menu-item" href="posts">Posts</NavLink>
                <NavLink class="menu-item" href="categories">Categories</NavLink>
                <NavLink class="menu-item" href="tags">Tags</NavLink>
                <NavLink class="menu-item apps" href="apps">Apps</NavLink>
            </div>
        </div>
    </nav>
</header>

可以看到有很多的NavLink組件,這是我將a標籤轉換后的內容,其實最終生成的也是我們熟悉的a標籤,不過他自然有獨特用處,看介紹:

創建導航鏈接時,請使用 NavLink 組件代替 HTML 超鏈接元素 (<a>)。 NavLink 組件的行為方式類似於 <a> 元素,但它根據其 href 是否與當前 URL 匹配來切換 active CSS 類。 active 類可幫助用戶了解所显示導航鏈接中的哪個頁面是活動頁面。

Footer.razor的內容如下:

<!-- Footer.razor -->
<footer id="footer" class="footer">
    <div class="copyright">
        <span>
            Powered by <a target="_blank" href="http://dot.net">.NET Core 3.1</a> and <a href="http://blazor.net/">Blazor</a> on Linux
        </span>
    </div>
</footer>

然後刪掉默認的多餘的組件:NavMenu.razorSurveyPrompt.razor

還有一個_Imports.razor,這個就是用來導入命名空間的,放在這裏面就相當於全局引用了。

現在去編輯我們的首頁Index.razor

@page "/"

<div class="main">
    <div class="container">
        <div class="intro">
            <div class="avatar">
                <a href="javascript:;"><img src="https://static.meowv.com/images/avatar.jpg"></a>
            </div>
            <div class="nickname">阿星Plus</div>
            <div class="description">
                <p>
                    生命不息,奮鬥不止
                    <br>Cease to struggle and you cease to live
                </p>
            </div>
            <div class="links">
                <NavLink class="link-item" title="Posts" href="posts">
                    <i class="iconfont iconread"></i>
                </NavLink>
                <NavLink target="_blank" class="link-item" title="Notes" href="https://notes.meowv.com/">
                    <i class="iconfont iconnotes"></i>
                </NavLink>
                <NavLink target="_blank" class="link-item" title="API" href="https://api.meowv.com/">
                    <i class="iconfont iconapi"></i>
                </NavLink>
                <NavLink class="link-item" title="Manage" href="/account/auth">
                    <i class="iconfont iconcode"></i>
                </NavLink>
                <NavLink target="_blank" class="link-item" title="Github" href="https://github.com/Meowv/">
                    <i class="iconfont icongithub"></i>
                </NavLink>
                <NavLink class="link-item weixin" title="掃碼關注微信公眾號:『阿星Plus』查看更多。">
                    <i class="iconfont iconweixin"></i>
                </NavLink>
                <div class="qrcode">
                    <img src="https://static.meowv.com/images/wx_qrcode.jpg" />
                </div>
            </div>
        </div>
    </div>
</div>

@page指令用於設置頁面路由地址,因為是首頁,所以直接給一個”/”就可以了。

至此項目算是搭建完成並且將其改造了一番,現在可以去運行一下看看效果了。

第一次打開或者強制刷新頁面會出現加載中的界面,我這裏就是一個小圈圈在那裡轉,當加載完畢后就會自動消失,什麼都不需要干,太方便了。

現在已經成功將首頁的显示搞定了,隨便點擊幾個按鈕試試,會輸出一個錯誤提示:Sorry, there’s nothing at this address,因為沒有找到這些路由,所以就…

默認的有點丑,並且這句提示當然也可以自定義的,現在來看最後的一個組件App.razor

<Router AppAssembly="@typeof(Program).Assembly">
    <Found Context="routeData">
        <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
    </Found>
    <NotFound>
        <LayoutView Layout="@typeof(MainLayout)">
            <p>Sorry, there's nothing at this address.</p>
        </LayoutView>
    </NotFound>
</Router>

通過語義化的代碼不難理解,Found就是找到與之匹配的路由,然後調用模板MainLayoutNotFound就是沒有找到的情況下,使用MainLayout並且在@body輸出一句提示。

將這句錯誤提示做成一個公共的組件並且美化一下,在Shared文件夾下新建組件:ErrorTip.razor,內容如下:

<div class="main">
    <div class="post-wrap">
        <h2 class="eror-tip">Sorry, there's nothing at this address.</h2>
    </div>
</div>

使用組件也很簡單,在App.razor中刪掉默認的p標籤然後調用ErrorTip

...
    <NotFound>
        <LayoutView Layout="@typeof(MainLayout)">
            <ErrorTip />
        </LayoutView>
    </NotFound>
...

再看一下打開了不存在路由的頁面的錯誤提示吧。

哈哈哈,是不是好看許多,接下來會完成主題切換,菜單展開關閉等等功能,其實這些可以用JavaScript很方便的實現,但是既然用了 Blazor 開發,所以還是用 .NET 代碼實現吧。

本篇就先到這裏,未完待續…

開源地址:https://github.com/Meowv/Blog/tree/blog_tutorial

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

【其他文章推薦】

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

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

※超省錢租車方案

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

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

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

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

Python機器學習筆記:SVM(3)——證明SVM,Python機器學習筆記:SVM(1)——SVM概述,Python機器學習筆記:SVM(2)——SVM核函數,Python機器學習筆記:SVM(3)——證明SVM,Python機器學習筆記:SVM(4)——sklearn實現

  說實話,凡是涉及到要證明的東西(理論),一般都不好惹。絕大多數時候,看懂一個東西不難,但證明一個東西則需要點數學功底,進一步,證明一個東西也不是特別難,難的是從零開始發明這個東西的時候,則顯得艱難(因為任何時代,大部分人的研究所得都不過是基於前人的研究成果,前人所做的是開創性的工作,而這往往是最艱難最有價值的,他們被稱為真正的先驅。牛頓也曾說過,他不過是站在巨人的肩上,你,我更是如此)。

  正如陳希孺院士在他的著作《數理統計學簡史》的第四章,最小二乘法中所講:在科研上諸多觀念的革新和突破是有着很多的不易的,或者某個定理在某個時期由有個人點破了,現在的我們看來一切都是理所當然,但在一切沒有發現之前,可能許許多多的頂級學者畢其功於一役,耗盡一生,努力了幾十年最終也是無功而返。

  上一節我學習了SVM的核函數內容,下面繼續對SVM進行證明,具體的參考鏈接都在第一篇文章中,SVM四篇筆記鏈接為:

Python機器學習筆記:SVM(1)——SVM概述

Python機器學習筆記:SVM(2)——SVM核函數

Python機器學習筆記:SVM(3)——證明SVM

Python機器學習筆記:SVM(4)——sklearn實現

  話休絮煩,要證明一個東西先要弄清楚它的根基在哪裡,即構成它的基礎是哪些理論。OK,以下內容基本上都是上文沒有學習到的一些定理的證明,包括其背後的邏輯,來源背景等東西。

  本文包括內容:

  • 1,線性學習器中,主要闡述感知機算法
  • 2,非線性學習器中,主要闡述 Mercer定理
  • 3,損失函數
  • 4,最小二乘法
  • 5,SMO算法的推導

  同樣,在學習這些之前,我們再複習一下SVM,這裏使用(http://staff.ustc.edu.cn/~ketang/PPT/PRLec5.pdf)的PPT來學習。

熱身:SVM的整理

  這裏直接借用別人的PPT粘貼在這裏,讓自己再梳理一遍SVM。

熱身1,Hard Margin SVM

熱身2,Soft Margin SVM

熱身3,LS-SVM

1,線性學習器

1.1 感知機算法

  這個感知器算法是在1956年提出的,年代久遠,依然影響着當今,當然,可以肯定的是,此算法亦非最優,後續會有更詳盡闡述。不過,有一點,你必須清楚,這個算法是為了干什麼的:不斷的訓練試錯以期尋找一個合適的超平面。

   下面,舉個例子。如下圖所示,憑我們的直覺可以看出,圖中紅線是最優超平面,藍線則是根據感知機算法在不斷的訓練中,最終,若藍線能通過不斷的訓練移動到紅線位置上,則代表訓練成功。

   既然需要通過不斷的訓練以讓藍線最終成為最優分類超平面,那麼到底需要訓練多少次呢?

  Novikoff 定理告訴我們當間隔是正的時候感知機算法會在有限次數的迭代中收斂,也就是說 Novikoff 定理證明了感知機算法的收斂性,即能得到一個界,不至於無窮循環下去。

  Novikoff 定理:如果分類超平面存在,僅需要在序列 S 上迭代幾次,在界為 (2R / γ)2 的錯誤次數下就可以找到分類超平面,算法停止。

  這裏的 R = max1<=i<=l||Xi|| ,γ 為擴充間隔。根據誤分次數公式可知,迭代次數與對應於擴充(包括偏置)權重的訓練集的間隔有關。

  順便再解釋下這個所謂的擴充間隔 γ , γ 即為樣本到分類間隔的距離,即從 γ 引出的最大分類間隔。之前我們推導過的內容,如下:

   在給出幾何間隔的定義之前,咱們首先來看下,如上圖所示,對於一個點 x,令其垂直投影到超平面上的對應的為 x0,由於 w 是垂直於超平面的一個向量, γ 為樣本 x 到分類間隔的距離,我們有:

   同時有一點值得注意:感知機算法雖然可以通過簡單迭代對線性可分數據生成正確分類的超平面,但不是最優效果,那怎麼才能得到最優效果呢,就是前面博文說的尋找最大分類間隔超平面。此外,Novikoff定理的證明請參考:http://www.cs.columbia.edu/~mcollins/courses/6998-2012/notes/perc.converge.pdf

2,非線性學習器

2.1 Mercer定理

   Mercer定理:如果函數 K 是 Rn *Rn – R 上的映射(也就是從兩個 n 維向量映射到實數域)。那麼如果K是一個有效核函數(也稱為 Mercer 核函數),那麼當且僅當對於訓練樣例 { x(1), x(2), …  x(m)},其相應的核函數矩陣是對稱半正定的。

  Mercer定理表明為了證明K是有效的核函數,那麼我們不用去尋找 Φ ,而只需要在訓練集上求出各個 Kij,然後判斷矩陣K是否是半正定(使用左上角主子式大於等於零等方法)即可。

  要理解這個 Mercer定理,先要了解什麼是半正定矩陣,要了解什麼是半正定矩陣,先得知道什麼是正定矩陣(矩陣理論博大精深,關於矩陣推薦一本書《矩陣分析與應用》),然後關於Mercer定理的證明參考:http://ftp136343.host106.web522.com/a/biancheng/matlab/2013/0120/648.html

  其實,核函數在SVM的分類效果中起到了重要的作用,下面鏈接有個 tutorial可以看看:https://people.eecs.berkeley.edu/~bartlett/courses/281b-sp08/7.pdf

2.2 正定矩陣

  在百度百科,正定矩陣的定義如下:在線性代數里,正定矩陣(positive definite materix)有時會簡稱為正定陣。在線性代數中,正定矩陣的性質類似於複數中的正實數。與正定矩陣相對應的線性算子是對稱的正定雙線性形式。

  廣義的定義:設 M 為 n 階方陣,如果對任何非零向量 z,都有 zTMz > 0,其中 zT 表示 z 的轉置,就稱 M  為正定矩陣。

  狹義的定義:一個 n 階的實對稱矩陣 M 是正定的條件是當且僅當對所有的非零實係數向量 z,都有 zTMz > 0,其中 zT 表示 z 的轉置。

  正定矩陣的性質:

  • 1,正定矩陣的行列式恆為正
  • 2,實對稱矩陣 A 正定當且僅當 A 與單位矩陣合同
  • 3,若 A 是正定矩陣,則 A 的逆矩陣也是正定矩陣
  • 4,兩個正定矩陣的和是正定矩陣
  • 5,正實數域正定矩陣的乘積是正定矩陣

3,損失函數

  之前提到過“支持向量機(SVM)是 90 年代中期發展起來的基於統計學習理論的一種機器學習方法,通過尋找結構化風險最小來提高學習機泛化能力,實現經驗風險和置信範圍的最小化,從而達到在統計樣本量較少的情況下,亦能獲得良好統計規律的目的。”但初次看到的人可能不了解什麼是結構化風險,什麼又是經驗風險。要了解這兩個所謂的“風險”,還得從監督學習說起。

  監督學習實際上就是一個經驗風險或者結構風險函數的最優化問題。風險函數度量平均意義下模型預測的好壞,模型每一次預測的好壞用損失函數來度量。它從假設空間 F 中選擇模型 f 作為決策函數,對於給定的輸入 X,由 f(x) 給出相應的輸出 Y,這個輸出的預測值 f(X)與真實值 Y 可能一致也可能不一致,用一個損失函數來度量預測錯誤的程度。損失函數記為 L(Y, f(X))。

  常用損失函數有以下幾種(摘抄於《統計學習方法》):

  (1) 0-1 損失函數

  (2)平方損失函數

   (3)絕對損失函數

   (4)對數損失函數

   給定一個訓練數據集

   模型 f(X) 關於訓練數據集的平均損失稱為經驗風險,如下:

   關於如何選擇模型,監督學習有兩種策略:經驗風險最小化和結構風險最小化。

  經驗風險最小化的策略認為,經驗風險最小的模型就是最優的模型,則按照經驗風險最小化求最優模型就是求解如下的最優化問題:

  當樣本容量很小時,經驗風險最小化的策略容易產生過擬合的現象。結構風險最小化可以防止過擬合。結構風險是在經驗風險的基礎上加上表示模型複雜度的正則化項或懲罰項,結構風險定義如下:

   其中 J(f) 為模型的複雜度,模型 f 越複雜,J(f) 值就越大,模型越簡單,J(f) 值就越小,也就是說J(f)是對複雜模型的乘法。λ>=0 是係數,用以衡量經驗風險和模型複雜度。結構風險最小化的策略認為結構風險最小的模型是最優的模型,所以求最優的模型就是求解下面的最優化問題:

   這樣,簡單學習問題就變成了經驗風險或結構化風險函數的最優化問題。如上式最優化問題的轉換。

   這樣一來,SVM就有第二種理解,即最優化+損失最小。如網友所言:“可以從損失函數和優化算法角度看SVM,Boosting,LR等算法,可能會有不同收穫”。

  關於損失函數:可以看看張潼的這篇《Statistical behavior and consistency of classification methods based on convex risk minimization》。各種算法中常用的損失函數基本都具有fisher一致性,優化這些損失函數得到的分類器可以看作是后驗概率的“代理”。此外,張潼還有另外一篇論文《Statistical analysis of some multi-category large margin classification methods》,在多分類情況下margin loss的分析,這兩篇對Boosting和SVM使用的損失函數分析的很透徹。

  關於統計學習方法的問題,可以參考:https://people.eecs.berkeley.edu/~bartlett/courses/281b-sp08/7.pdf

4,最小二乘法

4.1  什麼是最小二乘法?

  下面引用《正態分佈的前世今生》里的內容稍微簡單闡述一下。

  我們口頭經常經常說:一般來說,平均來說。如平均來說,不吸煙的健康優於吸煙者,之所有要加“平均” 二字,是因為凡是皆有例外,總存在某個特別的人他吸煙但由於經常鍛煉所以他的健康狀況可能會優於他身邊不吸煙的盆友。而最小二乘的一個最簡單例子便是算術平均。

  最小二乘法(又稱最小平方法)是一種數學優化技術。它通過最小化誤差的平方和尋找數據的最佳函數匹配。利用最小二乘法可以簡便的求得未知的數據,並使得這些求得的數據與實際數據之間誤差的平方和為最小。用函數表示為:

   使誤差(所謂誤差,當然是觀察值與實際真實值的差量)平方和達到最小以尋求估計值的方法,就叫做最小二乘法,用最小二乘法得到的估計,叫做最小二乘估計。當然,取平方和作為目標函數只是眾多可取的方法之一。

  最小二乘法的一般形式可表示為:

   有效的最小二乘法是勒讓得在1805年發表的,基本思想就是認為測量中有誤差,所以所有方程的累積誤差為:

   我們求解出導致累積誤差最小的參數即可:

   勒讓得在論文中對最小二乘法的優良性做了幾點說明:

  • 最小二乘的誤差平方和最小,並在各個方程的誤差之間建立了一種平衡,從而防止某個極端誤差取得支配地位。
  • 計算中只需要求偏導后求解線性方程組,計算過程明確便捷
  • 最小二乘可以導出算術平均值作為估計

  對於最後一點,從統計學的角度來看是很重要的一個性質。推理如下:假設真值為 Θ ,x1,…..xn 為 n 次測量值,每次測量的誤差為 ei = xi – Θ,按最小二乘法,誤差累積為:

  求解 Θ 使 L(Θ) 達到最小,正好是算術平均 xhat,其公式如下:

   由於算術平均是一個歷經考驗的方法,而以上的推理說明,算術平均是最小二乘的一個特例,所以從另外一個角度說明了最小二乘方法的優良性,使我們對最小二乘法更加有信息。

  最小二乘法發布之後很快得到了大家的認可接受,並迅速的在數據分析實踐中被廣泛使用。不過歷史上又有人把最小二乘法的發明歸功於高斯,這又是怎麼一回事呢?高斯在 1809 年也發表了最小二乘法,並且聲稱自己已經使用了這個方法多年。高斯發明了小行星定位的數學方法,並在數據分析中使用最小二乘方法進行計算,準確的預測了穀神星的位置。

  說了這麼多,貌似與SVM沒啥關係,但是別著急,請繼續聽,本質上說,最小二乘法即是一種參數估計方法,說到參數估計,咱們從一元線性模型說起。

4.2 最小二乘法的解法

   什麼是一元線性模型呢?我們引用(https://blog.csdn.net/qll125596718/article/details/8248249)的內容,先來梳理一下幾個基本的概念:

  • 監督學習中,如果預測的變量是離散的,我們稱其為分類(如決策樹,支持向量機等),如果預測的變量是連續的,我們稱其為回歸。
  • 回歸分析中,如果只包括一個自變量和一個因變量,且二者的關係可用一條直線近似表示,這種回歸分析稱為一元線性回歸分析。
  • 如果回歸分析中包括兩個或兩個以上的自變量,且因變量和自變量之間是線性關係,則稱為多元線性回歸分析。
  • 對於二維空間線性是一條直線;對於三維空間線性是一個平面,對於多維空間線性是一個超平面。

  對於一元線性回歸模型,假設從總體中獲取了 n 組觀察值(X1, Y1),(X2, Y2),…(Xn, Yn)。對於平面中的這 n 個點,可以使用無數條曲線來擬合。要求樣本回歸函數盡可能好的擬合這組值。綜合起來看,這條直線處於樣本數據的中心位置最合理。

  選擇最佳擬合曲線的標準可以確定為:使總的擬合誤差(即總殘差)達到最小,有以下三個標準可以選擇:

  • 1,用“殘差和最小”確定直線位置是一個途徑。但是很快發現計算“殘差和” 存在相互抵消的問題。
  • 2,用“殘差絕對值和最小”確定直線位置也是一個途徑。但絕對值的計算比較麻煩。
  • 3,最小二乘法的原則是以“殘差平方和最小” 確定直線位置。用最小二乘法除了計算比較方便外,得到的估計量還具有優良特性。這種方法對異常值非常敏感。

  最常用的是普通最小二乘法(Ordinary Least Square, OLS ):所選擇的回歸模型應該使所有觀察值的殘差平方和達到最小,即採用平方損失函數。

   我們定義樣本回歸模型為:

   得到誤差 ei (ei為樣本)為:

   接着,定義平方損失函數 Q:

   則通過Q最小確定這條直線,即確定 β0hat,  β1hat, β0hat,  β1hat為變量,把它們看做是 Q 的函數,就變成了一個求極值的問題,可以通過求導數得到。

  求 Q 對兩個待估參數的偏導數:

   根據數學知識我們知道,函數的極值點為偏導為 0 的點,解得:

   這就是最小二乘法的解法,就是求得平方損失函數的極值點。自此,我們可以看到求解最小二乘法和求解SVM是何等相似,尤其是定義損失函數,而後通過偏導求極值。

5,SMO算法

  無論Hard Margin 或 Soft Margin SVM,我們均給出了SVM的對偶問題,但並沒有說明對偶問題怎麼求解。由於矩陣Q的規模和樣本數相等,當訓練樣本數很大的時候,這個矩陣的規模很大,求解二次規劃問題的經典算法會遇到性能問題,也就是說同時求解 n 個拉格朗日乘子涉及很多次迭代,計算開銷太大,所以一般採用 Sequential Minimal Optimization(SMO)算法。

  SMO算法的基本思想每次只更新兩個乘子,迭代獲得最終解

  上文中,我們提到了求解對偶問題的序列最小最優化 SMO 算法,但並未提到其具體解法。首先看下最後懸而未決的問題:

   等價於求解:

   1998年,Microsoft Research 的John C. Platt 在論文《Sequential  Minimal Optimization:A Fast Alogrithm for Training Support Vector Machines》中提出針對上述問題的解法:SMO算法,它很快便成為最快的二次規劃優化算法,特別是針對線性SVM和數據稀疏時性能更優。這個算法的思路是每次在優化變量中挑出兩個分量進行優化,而讓其他分量固定,這樣才能保證滿足等式約束條件,這是一種分治法的思想。

  接下來,我們便參考 John C.Platt 的文章(找不到了。。。)來看看 SMO的解法。

5.1 SMO算法的推導

  首先我們來定義特徵到結果的輸出函數:

   注:這個 u 與我們之前定義的 f(x) 實質上是一樣的。

   接着,重新定義下我們原始的優化問題,權當重新回顧,如下:

   求導得到:

   代入 u 的公式中,可得:

   通過引入拉格朗日乘子轉換為對偶問題后,得:

   注:這裏得到的 min 函數與我們之前的 max 函數實質上也是一樣,因為把符號變下,即由 min 轉換為 max 的問題,且 yi也與之前的 y(i) 等價,yj 亦如此。

  經過加入鬆弛變量后,模型修改為:

   從而最終我們的問題變為:

  下面要解決的問題是:在 αi = { α1, α2, α3,……, αn} 上求上述目標函數的最小值。為了求解這些乘子,每次從中任意抽取兩個乘子 α1 和 α2,然後固定 α1 和 α2 以外的乘子 {α3, α4,….αn},使得目標函數只是關於 α1 和 α2 的函數。這樣,不斷的從一堆乘子中任意抽取兩個求解,不斷地迭代求解子問題,最終達到求解原問題的目的。

  (注意:下面均使用兩個相同的表達式,是參考了兩個方法,並且這兩個方法均易於理解,可以說我先看第一個公式的文章,然後偶爾有次看到第二個公式的文章,發現也很好理解,所以粘貼在這裏,特地說明

  我們首先給出對於這兩個常量的優化問題(稱為子問題)的求解方法。假設選取的兩個分量為 αi, αj,其他分量都固定(即當做常數)。由於:

  所以對偶問題的子問題的目標函數可以表達為:

  (更普及一點,可以寫成下面這樣)

   其中C是一個常數,前面的二次項很容易計算出來,一次項要複雜一些,並且:

  這裏的變量 α* 為變量 a 在上一輪迭代后的值。上面的目標函數是一個兩變量的二次函數,我們可以直接給出最小值的解析解(公式解)。

   為了解決這個子問題,首要問題便是每次如何選取 α1 和 α2。實際上,其中一個乘子是違反 KKT條件最嚴重的,另外一個乘子則由另一個約束條件選取。

  根據KKT條件可以得到目標函數中 αi 取值的意義:

   這裏的 αi 還是拉格朗日乘子:

  • 1,對於第一種情況,表明 αi 是正常分類,在間隔邊界內部(我們知道正確分類的點 yi * f(xi) >= 0)
  • 2,對於第二種情況,表明了 αi 是支持向量,在間隔邊界上
  • 3,對於第三種情況,表明了 αi 是在兩條間隔邊界之間

  而最優解需要滿足KKT 條件,即上述三個條件都得滿足,以下幾種情況出現將會出現不滿足:

  • 1,yiui <=1,但是 αi < C 則不是不滿足的,而原本 αi = C
  • 2,yiui >=1,但是 αi > C 則不是不滿足的,而原本 αi = C
  • 3,yiui =1,但是 αi = 0 或者  αi = C 則不是不滿足的,而原本 0  < αi < C

  也就是說,如果存在不滿足 KKT 條件的 αi ,那麼需要更新這些 αi ,這是第一個約束條件。此外,更新的同時還要受到第二個約束條件的限制,即:

   因此,如果假設選擇的兩個乘子  α1 和 α2 ,他們在更新之前分別是  α1old 和 α2old,更新之後分別是  α1new 和 α2new,那麼更新前後的值需要滿足以下等式才能保證和為 0  的約束:

   其中,ξ 是常數,(上面兩個式子都一樣,只不過第二個更容易理解)。

  兩個因子不好同時求解,所以可選求第二個乘子 α2 的解(α2new),得到 α2 的解(α2new)之後,再利用 α2 的解(α2new)表示 α1 的解(α1new).

  為了求解 α2 的解(α2new),得先確定 α2new 的取值範圍。假設它的上下邊界分別為 H 和 L,那麼有:

   接下來,綜合下面兩個約束條件,求解 α2new 的取值範圍:

   由於 yi,  yj(也可以說為 y1  y2)的取值只能為 +1 或者 -1,那麼當他們異號,也就是當 y1 != y2 時,根據:

   可得:  α1old – α2old  = ξ   (  αi – αj  = ξ),它確定的可行域是一條斜率為1的直線段,因為αi αj 要滿足約束條件

  他們的可行域如下圖所示:

  上面兩條直線分別對應於 y1為 +1 和 -1 的情況。如果是上面那條直線,則 αj 的取值範圍為 [-ξ, C]。如果是下面的那條直線,則為 [0,C-ξ]。

  對於這兩種情況 αj 的下界和上界可以統一寫成如下形式:

  因為   αi – αj  = ξ ,所以又可以寫為:  L =  max (0, -ξ),  H = min(C, C-ξ)

  下邊界是直線和 x 軸交點的 x 坐標以及 0 的較大值;上邊界是直線和的交點的 x 坐標和 C 的較小值。

   再來看第二種情況,如果 yi  yj 同號,即當 y1 = y2 時,同樣根據:

   可得:  α1old + α2old  = ξ (  αi  +  αj  = ξ ),所以有:

 

   根據   αi  +  αj  = ξ  , 上式也可寫為:L =  max (0, ξ – C),  H = min(C, ξ)

  這種情況如下圖所示:

   如此,根據這兩個變量的等式約束條件( y1 和 y2 異號或者同號),可以消掉α2old ,可得出 α2new 的上下界分別為:

   回顧下第二個約束條件:

  下面我們來計算不考慮截斷時的函數極值。為了避免分 -1 和 +1 兩種情況,我們將上面的等式約束兩邊同時乘以 y1(第二種表達是乘以yi),可得:

   其中 α1 可以用 α2 表示,α1 = w – s*α2,從而我們把子問題的目標函數轉換為只含 α2 的問題:

   對 α2 求導(即對自變量求導),並令導數為零,可得:

   由於:

   化簡下:

   然後將:

   代入上式,可得:

   下面令(其中 Ei 表示預測值與真實值之差):

   然後上式兩邊同時除以 η ,得到一個關於單變量 α2 的解:

  在求得  αj 之後,根據等式約束條件我們就可以求得另外一個變量的值:

  目標函數的二階導數為 η,前面假設二階導數 η  > 0,從而保證目標函數是凸函數即開口向上的拋物線,有極小值。如果 η  < 0 或者 η  = 0,該怎麼處理?對於線性核或正定核函數,可以證明矩陣K的任意一個上述子問題對應的二階子矩陣半正定,因此必定有 η  >= 0。無論本次迭代時的初始值是多少,通過上面的子問題求解算法得到是在可行域里的最小值,因此每次求解更新這兩個變量的值之後,都能保證目標函數值小於或者等於初始值,即函數值下降。

   這個解沒有考慮其約束條件 0 <=  α2 <= C,即是未經剪輯時的解。

  然後考慮約束 0 <=  α2 <= C 可得到經過剪輯后的 α2new 的解析解為:

  (如果用αi,αj表示,則我們求的這個二次函數的最終極值點為:)

   求出了 α2new后,便可以求出α1new ,得:

  這三種情況下的二次函數極小值如下圖所示:

  上圖中第一種情況是拋物線的最小值點在 [L, H]中;第二種情況是拋物線的最小值點大於 H,被截斷為H;第三種情況是小於L,被截斷為L。

   那麼如何選擇乘子   α1 和 α2呢?

  1. 對於 α1 ,即第一個乘子,可以通過剛剛說的那3種不滿足 KKT的條件來找
  2. 而對於第二個乘子 α2 可以尋找滿足條件: max |Ei – Ej| 的乘子

  而 b 滿足下述條件:

   下面更新 b:

   且每次更新完兩個乘子的優化后,都需要再重新計算 b,及對應的 Ei值。

  最後更新所有的 αi,y 和 b,這樣模型就出來了,從而即可求出咱們開頭提出的分類函數:

   此外,這裡有一篇類似的文章,大家可以參考下(https://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html)。

 5.2  SMO算法的步驟

  綜上,總結下SMO的主要步驟,如下:

   意思是:

  • 1,第一步:選取一對 αi 和 αj,選取方法使用啟髮式方法
  • 2,第二步:固定除αi 和 αj 之外的其他參數,確定W 極值條件下的 αi 和 αj 由 αi 表示

  假定在某一次迭代中,需要更新 x1,x2 對應的拉格朗日乘子 α1,α2,那麼這個小規模的二次規劃問題寫為:

   那麼在每次迭代中,如何更新乘子呢?引用下面地址(http://staff.ustc.edu.cn/~ketang/PPT/PRLec5.pdf)的兩張PPT說明下:

   知道了如何更新乘子,那麼選取哪些乘子進行更新呢?具體有以下兩個步驟:

  • 步驟一:先“掃描”所有乘子,把第一個違反KKT條件的作為更新對象,令為 a1
  • 步驟二:在所有不違反KKT條件的乘子中,選擇使 |E1 – E2|最大的 a2 進行更新,使得能最大限度增大目標函數的值(類似於梯度下降,此外 Ei = ui – yi,而 u = w*x – b ,求出來的 E 代表函數 ui 對輸入 xi 的預測值與真實輸出類標記 yi 之差)

  最後,每次更細完兩個乘子的優化后,都需要再重新計算 b,及對應的 Ei 值。

  綜上,SMO算法的基本思想是把 Vapnik 在 1982年提出的 Chunking方法推到極致,SMO算法每次迭代只選出兩個分量 ai 和 aj 進行調整,其他分量則保持固定不變,在得到 解 ai 和 aj 之後,再用 ai 和 aj 改進其他分量。與通常的分解算法比較,儘管它可能需要更多的迭代次數,但每次迭代的計算量比較小,所以該算法表現出較好的快速收斂性,且不需要存儲核函數,也沒有矩陣運算。

5.3  SMO算法的實現

  行文至此,我相信,SVM理解到了一定程度后,是的確能在腦海里從頭到尾推導出相關公式的,最初分類函數,最大化分類間隔,max1/||w||,min1/2||w||^2,凸二次規劃,拉格朗日函數,轉化為對偶問題,SMO算法,都為尋找一個最優解,一個最優分類平面。一步步梳理下來,為什麼這樣那樣,太多東西可以追究,最後實現。

  至於上文中將闡述的核函數則是為了更好的處理非線性可分的情況,而鬆弛變量則是為了糾正或約束少量“不安分”或脫離集體不好歸類的因子。

      台灣的林智仁教授寫了一個封裝SVM算法的libsvm庫,大家可以看看,此外這裏還有一份libsvm的註釋文檔。在這篇論文《fast training of support vector machines using sequential minimal optimization》中platt給出了SMO算法的邏輯代碼。

5.4  SMO算法的優缺點

  優點:

  • 可保證解的全局最優解,不存在陷入局部極小值的問題
  • 分類器複雜度由支撐向量的個數,而非特徵空間(或核函數)的維數決定,因此較少因維數災難發生過擬合線性

  缺點:

  1. 需要求解二次規劃問題,其規模與訓練模式量成正比,因此計算複雜度高,且存儲開銷大,不適用於需進行在線學習/訓練的大規模分類問題  

  這篇文章主要參考:https://mp.weixin.qq.com/s/ZFWJUazMbAqeoSIkXjuG5g

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

【其他文章推薦】

※超省錢租車方案

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

※回頭車貨運收費標準

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

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

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

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