日本科學博物館免費開放線上數位恐龍展覽室,用 360 影像觀賞恐龍化石_貨運

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

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

恐龍,這些曾經存活在地球的巨大生物一直受到很多人的喜愛,不管大朋友還是小朋友都能由恐龍的生態變化中窺知地球環境變遷等頗富教育意義的課題。在疫情問題全球化的現在,爸媽也不太敢帶孩子前往人潮擁擠的密閉環境中,不過現在你可以跟孩子一起在家透過網路觀賞各種恐龍化石。

日本科學博物館免費開放線上數位恐龍展覽室,用 360 影像觀賞恐龍化石

從 2013 年以來,日本國家科學博物館就開始與凸版印刷株式會社合作,持續開發和利用 VR 技術來將恐龍化石的 3D 形狀測量數據紀錄下來,並且將內容 VR 化。近日更於網路上免費開放了「數位恐龍展覽室」(ディノ・ネット デジタル恐竜展示室),將日本各博物館館藏的 7 種、9 款恐龍化石以 VR 技術做成可供網友進行 360 度觀賞的模型影像,讓大家能夠藉由網路從各種不同角度來觀賞化時的樣貌。
【免費觀賞恐龍化石 3D 影像,點這裡】

在這次開放的素材中,包含異特龍(Allosaurus)與厚頭龍(Pachycephalosaurus)的測量數據,另外還有群馬縣自然歷史博物館、北海道大學綜合博物館、鵡川穗別博物館等珍貴的館藏恐龍化石的實際測量 3D 影像 和 VR 影像。當你點選後網站會引導以內嵌的 Sketchfub 來開啟 3D 與 VR 影像,你可以用滑鼠來旋轉、點擊縮放影像,部分恐龍影像上還有標註點可供點擊查看資訊(不過是日文)。

這些被上網公開的恐龍資料都是實際測量後的結果,轉換成數位 3D 與 VR 檔案的工程也非常浩大,所以內容實在相當珍貴,接下來寒假要到了,爸媽可以和孩子一起觀看恐龍化石影響,來一個了解恐龍的親子共讀寓教於樂時光。

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

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

部分AirPods Max 用戶反映耗電嚴重,閒置一夜幾乎完全噴光_租車

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

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

在 12 月時,Apple 推出首款自家頭戴式降噪耳機 AirPods Max,讓旗下耳機陣容更豐富,極具設計感的外觀讓許多消費者趨之若鶩,但自推出以來越來越多用戶在國外論壇上反映手邊的 AirPods Max 出現電池消耗過快的問題,甚至放一晚電力就只剩 5%。

部分AirPods Max 用戶反映耗電嚴重,閒置一夜幾乎完全噴光

Apple 在一份支援文件中寫到,AirPods Max 被設計成在閒置五分鐘後進入「低耗電模式」(沒有放在收納盒中),如果沒有去碰觸拿取,AirPods Max 將以低耗電模式維持三天,之後進入「超低耗電」的狀態,自動切斷藍牙和查找功能。而在放入智慧收納盒時,AirPods Max 被設計為立即進入低耗電模式,不須等候閒置時間。

據國外媒體 MacRumors 的報導,目前有許多網友在論壇上回饋,表示 AirPods Max 的電池消耗極大,首先式一位網友 VL_424 表示,從推出後就一直在使用,但卻始終受到嚴重耗電的問題所苦,舉例來說,前一天晚上拿出殘餘電量還有 85% 的耳機用了大約 15 分鐘後放回收納盒裡,結果在早上 iPhone 就收到通知表示耳機剩下 5% 的電量,奇怪的是整個過程中,用戶都沒有嘗試連接到 AirPods Max,而是在房間用 HomePod 聽音樂,而 AirPods Max 似乎沒有近入低耗電狀態,一直保持使用中的耗電狀態。

從許多投訴中可以看到,AirPods Max 沒有正確進入低耗電模式,而且因為本身並沒有設置電源按鈕,無法為了節省耗電而強制關閉它。部分用戶認為,問題可能與產品在靜置時或進入低耗電模式後未中斷與設備的連接有關,因為沒有關機選項,所以才會出現 AirPods Max 即使在低耗電模式下似乎一夜之間耗盡所有電力的問題。

考慮到有關電量過度消耗的報告數量與日俱增,Apple 似乎必須盡快推出更新來解決這個軟體錯誤,但迄今為止,還沒有新的韌體版本,用戶就請靜候通知吧!

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

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

◎資料來源:MacRumors

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

Magicodes.IE 在100萬數據量下導入導出性能測試_貨運

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

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

原文作者:HueiFeng

前言

目前Magicodes.IE更新到了2.2.3,感謝大家的支持,同時建議大家在使用過程中如果遇到一些問題或者說需要一些額外的功能可以直接提issues,當然更建議大家提PR。

近期更新

2020.05.24

  • 【Nuget】版本更新到2.2.2

  • 【Excel導入】增加了stream導入擴展方法

  • 【Excel導出】增加了內容居中(單列居中、整表居中)

  • 【導出】對一些中間件代碼進行了修復及優化

2020.05.16

  • 【Nuget】版本更新到2.2.1

  • 【PDF導出】對模板引擎進行升級更新

2020.05.12

  • 【Nuget】版本更新到2.2.0

  • 【Excel模板導出】支持導出字節

  • 【文檔】Magicodes.IE Csv導入導出

    ※回頭車貨運收費標準

    宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

  • 【Excel導入導出】修復標註的添加問題

  • 【導出】ASP.NET Core Web API 中使用自定義格式化程序導出Excel、Pdf、Csv等內容 #64

  • 【導入導出】支持使用System.ComponentModel.DataAnnotations命名空間下的部分特性來控制導入導出 #63

性能測試

電腦配置以及環境如下所示:


BenchmarkDotNet=v0.12.1, OS=Windows 10.0.18363.836 (1909/November2018Update/19H2)
AMD Ryzen 5 3600X, 1 CPU, 12 logical and 6 physical cores
.NET Core SDK=5.0.100-preview.4.20258.7
  [Host]     : .NET Core 3.1.4 (CoreCLR 4.700.20.20201, CoreFX 4.700.20.22101), X64 RyuJIT
  Job-OONFAJ : .NET Framework 4.8 (4.8.4180.0), X64 RyuJIT
  Job-YIUEXF : .NET Core 2.2.8 (CoreCLR 4.6.28207.03, CoreFX 4.6.28208.02), X64 RyuJIT
  Job-LZHMKS : .NET Core 3.1.4 (CoreCLR 4.700.20.20201, CoreFX 4.700.20.22101), X64 RyuJIT
​
IterationCount=5  LaunchCount=1  WarmupCount=1  

Excel & Csv 導出

Excel導出如下所示:

Method Job Runtime RowsCount Mean Error StdDev
ExportExcelAsByteArrayTest Job-OONFAJ .NET 4.6.1 10000 153.1 ms 5.52 ms 0.85 ms
ExportExcelAsByteArrayTest Job-YIUEXF .NET Core 2.2 10000 138.0 ms 1.53 ms 0.40 ms
ExportExcelAsByteArrayTest Job-LZHMKS .NET Core 3.1 10000 143.0 ms 9.86 ms 1.53 ms
ExportExcelAsByteArrayTest Job-OONFAJ .NET 4.6.1 120000 1,904.2 ms 98.37 ms 25.55 ms
ExportExcelAsByteArrayTest Job-YIUEXF .NET Core 2.2 120000 1,662.8 ms 132.04 ms 20.43 ms
ExportExcelAsByteArrayTest Job-LZHMKS .NET Core 3.1 120000 1,636.1 ms 99.64 ms 25.88 ms
ExportExcelAsByteArrayTest Job-OONFAJ .NET 4.6.1 240000 3,688.3 ms 58.52 ms 15.20 ms
ExportExcelAsByteArrayTest Job-YIUEXF .NET Core 2.2 240000 3,268.1 ms 138.16 ms 21.38 ms
ExportExcelAsByteArrayTest Job-LZHMKS .NET Core 3.1 240000 3,223.9 ms 70.93 ms 10.98 ms
ExportExcelAsByteArrayTest Job-OONFAJ .NET 4.6.1 500000 7,723.4 ms 179.06 ms 46.50 ms
ExportExcelAsByteArrayTest Job-YIUEXF .NET Core 2.2 500000 6,959.7 ms 481.61 ms 125.07 ms
ExportExcelAsByteArrayTest Job-LZHMKS .NET Core 3.1 500000 6,833.2 ms 331.74 ms 86.15 ms
ExportExcelAsByteArrayTest Job-OONFAJ .NET 4.6.1 1000000 15,443.7 ms 582.64 ms 151.31 ms
ExportExcelAsByteArrayTest Job-YIUEXF .NET Core 2.2 1000000 13,798.9 ms 207.09 ms 32.05 ms
ExportExcelAsByteArrayTest Job-LZHMKS .NET Core 3.1 1000000 13,484.1 ms 424.85 ms 110.33 ms

Csv導出如下所示:

Method Job Runtime RowsCount Mean Error StdDev
ExportCsvAsByteArrayTest Job-SRSOYE .NET 4.6.1 10000 30.43 ms 2.493 ms 0.647 ms
ExportCsvAsByteArrayTest Job-WLDFBY .NET Core 2.2 10000 30.12 ms 5.981 ms 1.553 ms
ExportCsvAsByteArrayTest Job-JSEPRQ .NET Core 3.1 10000 24.53 ms 0.142 ms 0.022 ms
ExportCsvAsByteArrayTest Job-SRSOYE .NET 4.6.1 120000 345.51 ms 16.385 ms 4.255 ms
ExportCsvAsByteArrayTest Job-WLDFBY .NET Core 2.2 120000 330.03 ms 16.025 ms 4.162 ms
ExportCsvAsByteArrayTest Job-JSEPRQ .NET Core 3.1 120000 287.98 ms 11.898 ms 3.090 ms
ExportCsvAsByteArrayTest Job-SRSOYE .NET 4.6.1 240000 687.57 ms 10.379 ms 2.695 ms
ExportCsvAsByteArrayTest Job-WLDFBY .NET Core 2.2 240000 656.00 ms 13.741 ms 2.126 ms
ExportCsvAsByteArrayTest Job-JSEPRQ .NET Core 3.1 240000 560.43 ms 12.721 ms 3.304 ms
ExportCsvAsByteArrayTest Job-SRSOYE .NET 4.6.1 500000 1,478.88 ms 31.074 ms 8.070 ms
ExportCsvAsByteArrayTest Job-WLDFBY .NET Core 2.2 500000 1,379.52 ms 20.652 ms 5.363 ms
ExportCsvAsByteArrayTest Job-JSEPRQ .NET Core 3.1 500000 1,182.48 ms 39.358 ms 10.221 ms
ExportCsvAsByteArrayTest Job-SRSOYE .NET 4.6.1 1000000 2,918.99 ms 43.023 ms 6.658 ms
ExportCsvAsByteArrayTest Job-WLDFBY .NET Core 2.2 1000000 2,751.29 ms 19.970 ms 5.186 ms
ExportCsvAsByteArrayTest Job-JSEPRQ .NET Core 3.1 1000000 2,332.39 ms 57.988 ms 8.974 ms

Excel & Csv 導入

Excel導入如下所示:

Method Job Runtime RowsCount Mean Error StdDev
ImportByStreamTest Job-URKTYJ .NET 4.6.1 10000 711.4 μs 136.2 μs 35.37 μs
ImportByStreamTest Job-AFBGUZ .NET Core 2.2 10000 746.2 μs 131.8 μs 20.40 μs
ImportByStreamTest Job-DUXAFG .NET Core 3.1 10000 792.4 μs 186.5 μs 48.42 μs
ImportByStreamTest Job-URKTYJ .NET 4.6.1 120000 2,297.6 μs 181.3 μs 47.08 μs
ImportByStreamTest Job-AFBGUZ .NET Core 2.2 120000 2,139.5 μs 204.5 μs 53.12 μs
ImportByStreamTest Job-DUXAFG .NET Core 3.1 120000 2,035.8 μs 304.8 μs 47.17 μs
ImportByStreamTest Job-URKTYJ .NET 4.6.1 240000 5,378.2 μs 887.9 μs 230.59 μs
ImportByStreamTest Job-AFBGUZ .NET Core 2.2 240000 5,345.6 μs 989.9 μs 257.08 μs
ImportByStreamTest Job-DUXAFG .NET Core 3.1 240000 4,672.5 μs 1,004.5 μs 260.86 μs
ImportByStreamTest Job-URKTYJ .NET 4.6.1 500000 11,336.6 μs 657.3 μs 170.69 μs
ImportByStreamTest Job-AFBGUZ .NET Core 2.2 500000 10,833.4 μs 952.9 μs 247.45 μs
ImportByStreamTest Job-DUXAFG .NET Core 3.1 500000 10,525.7 μs 561.0 μs 145.69 μs
ImportByStreamTest Job-URKTYJ .NET 4.6.1 1000000 21,965.7 μs 1,058.5 μs 274.88 μs
ImportByStreamTest Job-AFBGUZ .NET Core 2.2 1000000 20,612.1 μs 628.2 μs 163.14 μs
ImportByStreamTest Job-DUXAFG .NET Core 3.1 1000000 20,451.1 μs 3,807.7 μs 988.84 μs

Csv導入如下所示:

Method Job Runtime RowsCount Mean Error StdDev
ImportByStreamTest Job-OPUXWE .NET 4.6.1 10000 294.1 μs 1.99 μs 0.31 μs
ImportByStreamTest Job-OVPAAE .NET Core 2.2 10000 283.7 μs 3.54 μs 0.55 μs
ImportByStreamTest Job-AMXXYD .NET Core 3.1 10000 284.5 μs 1.77 μs 0.46 μs
ImportByStreamTest Job-OPUXWE .NET 4.6.1 120000 2,116.1 μs 13.28 μs 2.05 μs
ImportByStreamTest Job-OVPAAE .NET Core 2.2 120000 1,855.8 μs 80.59 μs 20.93 μs
ImportByStreamTest Job-AMXXYD .NET Core 3.1 120000 1,849.3 μs 186.63 μs 48.47 μs
ImportByStreamTest Job-OPUXWE .NET 4.6.1 240000 5,121.9 μs 270.99 μs 70.37 μs
ImportByStreamTest Job-OVPAAE .NET Core 2.2 240000 4,448.3 μs 84.91 μs 13.14 μs
ImportByStreamTest Job-AMXXYD .NET Core 3.1 240000 4,301.9 μs 78.77 μs 20.46 μs
ImportByStreamTest Job-OPUXWE .NET 4.6.1 500000 11,245.2 μs 120.46 μs 18.64 μs
ImportByStreamTest Job-OVPAAE .NET Core 2.2 500000 10,214.1 μs 113.20 μs 29.40 μs
ImportByStreamTest Job-AMXXYD .NET Core 3.1 500000 10,460.1 μs 90.90 μs 23.61 μs
ImportByStreamTest Job-OPUXWE .NET 4.6.1 1000000 21,807.0 μs 299.03 μs 46.28 μs
ImportByStreamTest Job-OVPAAE .NET Core 2.2 1000000 19,830.9 μs 186.01 μs 48.30 μs
ImportByStreamTest Job-AMXXYD .NET Core 3.1 1000000 20,051.3 μs 395.98 μs 102.83 μs

Reference

https://github.com/dotnetcore/Magicodes.IE

 

原文作者:HueiFeng

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

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

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

Python機器學習筆記:SVM(1)——SVM概述,Python機器學習筆記:SVM(1)——SVM概述,Python機器學習筆記:SVM(2)——SVM核函數,Python機器學習筆記:SVM(3)——證明SVM,Python機器學習筆記:SVM(4)——sklearn實現,Python機器學習筆記:Logistic Regression_網頁設計公司

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

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

前言

  整理SVM(support vector machine)的筆記是一個非常麻煩的事情,一方面這個東西本來就不好理解,要深入學習需要花費大量的時間和精力,另一方面我本身也是個初學者,整理起來難免思路混亂。所以我對SVM的整理會分為四篇(暫定為四篇)學習,不足之處,請多多指導。

  四篇分別為:

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

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

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

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

  在整理筆記的時候,參考了不少的資料,不少網絡寫的優秀論文,博客,回答等。於是我在學習了SVM之後,加入了自己的理解,結合網友的筆記整理了自己能理解的SVM,於此寫下自己的學習筆記。本着取之於網絡,還之於網絡的想法,最後將博客公開,最後申明一下,參考的博客,知乎等地址,我均會附於文章後面,不喜勿噴,謝謝。

  下面言歸正傳,開始學習SVM。

1,SVM的基本思想

  支持向量機,因為英文名為 support vector machine,故一般簡稱為SVM。他是一種常用的判別方法,在機器學習領域是一個有監督的學習模式,通常用來進行模型識別,分類,回歸分析以及異常值檢測。

  通俗的講:支持向量機是一種兩類分類模型,其基本模型定義為特徵空間上的間隔最大的線性分類器,其學習策略(分割原則)便是間隔最大化,最終可轉換為一個凸二次規劃問題的求解

  支持向量機是許多大佬在多年研究統計學習理論基礎上對線性分類器提出的另一種設計最佳準則。其原理也從線性可分說起,然後擴展到線性不可分的情況。甚至擴展到使用非線性函數中去。

  支持向量機的提出有很深的理論背景,這個我們後面再學習,下面先說一下SVM的基本思想,SVM的主要思想可以概括為兩點:

  1 它是針對線性可分情況進行分析,對於線性不可分情況,通過使用非線性映射算法將低維輸入空間線性不可分的樣本轉化為高維特徵空間使其可分,從而使得高維特徵空間採用線性算法對樣本的非線性特徵進行線性分析成為可能。

  2 它是基於結果風險最小化理論之上在特徵空間中構建最優超平面,使得學習器得到全局最優化,並且在整個樣本空間的期望以某個概率滿足一定上界。

  支持向量機的線性分類:是給定一組訓練實例,每個訓練實例被標記為屬於兩個類別中的一個或另一個,SVM訓練算法創建一個將新的實例分配給兩個類別之一的模型,使其成為非概率二元線性分類器。SVM模型是將實例表示為空間中的點,這樣映射就使得單獨類別的實例被盡可能寬的明顯的間隔分開。然後,將新的實例映射到同一空間,並基於他們落在間隔的哪一側來預測所屬類別。

  支持向量機的非線性分類:除了進行線性分類之外,SVM還可以使用所謂的核技巧有效的進行非線性分類,將其輸入隱式映射到高維特徵空間中。當數據未被標記時,不能進行監督式學習,需要用非監督式學習,它會嘗試找出數據到簇的自然聚類,並將新數據映射到這些已形成的簇。將支持向量機改進的聚類算法被稱為支持向量聚類,當數據未被標記或者僅一些數據被標記時,支持向量聚類經常在工業應用中用作分類步驟的預處理。

   SVM(Support Vector Machines)——支持向量機是在所有知名的數據挖掘算法中最健壯,最準確的方法之一,它屬於二分類算法,可以支持線性和非線性的分類。發展到今天,SVM已經可以支持多分類了。

  首先,我們看一個例子:

   比如上圖中,我們用一條直線將兩類數據分開了,但是我畫了三條線,而且這三條都能分開,但是這三條線那條更好呢?用SVM的思想來說,就是什麼樣的決策邊界才是最好的呢?更進一步,當數據特徵更加複雜,本身如果很難分,怎麼辦呢?那特徵複雜后,計算複雜度如何呢那SVM能實際應用嗎

  讓我們帶着這些問題來學習SVM,而理解SVM,我們先得明白一個概念:線性分類器。

2,分類標準的起源:Logistic回歸

  之前整理的Logistic回歸博文地址:

Python機器學習筆記:Logistic Regression

  我們從最起源說起,雖然說之前博文已經學習過Logistic 回歸了,不懂的可以去看看,有詳細的筆記。但是這裏我還是簡單的再學習一邊別人理解的Logistic回歸筆記,溫故而知新。

  給定一些數據點,他們分別屬於兩個不同的類,現在要找到一個線性分類器把這些數據分成兩類。如果用 x 表示數據點,用 y表示類別(y可以取1或者-1,代表兩個不同的類),一個線性分類器的學習目標便是要在 n 維的數據空間中找到一個超平面(hyper plane),這個超平面的方程可以表示為(其中WT中的T表示轉置):

   Logistic回歸的目的是從特徵學習出一個 0/1 分類模型,而這個模型是將特徵的線性組合作為自變量,由於自變量的取值範圍是負無窮到正無窮。因此,使用Logistic函數(或者也稱為Sigmoid函數)將自變量映射到(0, 1)上,映射后的值被認為是屬於 y=1 的概率。

  我們假設函數如下:

   其中 x 是 n 維特徵向量,函數 g 就是Logistic函數,我們令 z = ΘTx ,則 g(z)為:

   其圖像為:

   可以看到,將無窮映射到了(0,  1),而我們假設的 hΘx 就是特徵屬於 y=1的概率:

   從而,當我們要判別一個新來的特徵屬於那個類的時候,只需要求出 hΘx 即可,若 hΘx 大於 0.5就是 y=1的類,反之屬於 y=0 的類。

   此外,hΘx 只和 θTx有關, θTx >0 ,那麼 hΘx >0.5,而 g(z) 只是用來映射,真實的類別決定權還是在於  θTx 。再者,當  θTx >> 0 時,hΘx = 1,反之 hΘx = 0。如果我們只從  θTx 出發,希望模型達到的目標就是讓訓練數據中 y=1 的特徵  θTx >> 0,而 y=0 的特徵  θTx << 0。Logistic回歸就是要學習得到  θ,使得正例的特徵遠大於0,負例的特徵遠小於0,而且要在全部訓練實例上達到這個目標。

  接下來,嘗試把 Logistic 回歸做個變形。首先,將使用的結果標籤 y=0 和 y=1 替換為 y = -1, y=1,然後將下面公式的 θ0 替換為 b。

   最後將後面的 一串替換為 WTx,即下面一串被替換:

   如此,則有了:

   也就是說除了將 y由 y=0 變為 y=-1外,線性分類函數跟 logistic回歸的形式化g表示函數沒有區別,下面是Logistic回歸的形式化表示函數:

  對於邏輯回歸我們先說到這裏,下面看線性分類和邏輯回歸的比較。

  SVM和Logistic雖然說都是尋找一個線性分類界限,但出發點不同。SVM是以訓練集兩個類的邊界(支持向量)來考慮劃分,而Logistic是從訓練集的全局來考慮劃分。這也就是為什麼Logistic受噪聲和離群點的影響比較大。當出現一個離群點時,Logistic劃定的邊界很有可能會改變。而SVM這邊劃分的邊界卻可能絲毫不動(因為離群點並不影響我支持向量)。

3,線性分類的一個例子

3.1 線性可分的二分類模型

  什麼是線性可分呢?如果一個線性函數能夠將樣本分開,稱這些數據樣本是線性可分的。那麼什麼是線性函數呢?在二維空間中就是一條直線,在三維空間中就是一個平面,依次類推,如果不考慮空位維度,這樣的線性函數就統稱為超平面。我們一般所說的線性可分支持向量機就對應着能將數據正確劃分並且間隔最大的直線。

  定理1:線性二分類模型的目標就是找到一組合適的參數(w,  b),使得:

   即:線性二分類模型希望在特徵空間找到一個劃分超平面,將屬於不同標記的樣本分開

  我們下面舉個簡單的例子。如下圖所示,現在有一個二維平面,平面上有兩種不同的數據,分別用圈和叉表示。由於這些數據是線性可分的,所以可以用一條直線將這兩類數據分開,這條直線就相當於一個超平面,超平面一邊的數據點所對應的 y 全是 -1 ,另一邊所對應的 y 全是1。

   上面的超平面可以用分類函數 f(x) 表示,f(x)如下:

   當 f(x)=0 的時候,x便是位於超平面上的點,而 f(x) > 0的點對應 y=1 的數據點,f(x) < 0 的點對應 y = -1的點,如下圖所示:

   換言之,在進行分類的時候,遇到一個新的數據點 x,將 x 代入 f(x) 中,如果 f(x) 小於0,則將 x 的類別賦予 -1,稱 xi 為負例;如果 f(x) 大於  0,則將 x 的類別賦予 1,稱xi為正例。

  所以接下來的問題是,如何確定這個超平面呢?從直觀上而言,這個超平面應該是最適合分類兩類數據的直線。而判定“最適合”的標準就是這條直線離直線兩邊的數據的間隔最大。所以,得尋找有着c最大間隔的超平面。這個問題,我們先擱置一下,下面說一下線性可分支持向量機。

3.2 線性可分支持向量機  

  線性可分支持向量機(SVM)也是一種線性二分類模型,也需要找到滿足 定理1 約束的劃分超平面,即(w,  b),由於能將樣本分開的超平面可能有很多,SVM進一步希望找到離個樣本都比較遠的劃分超平面。

  當面對樣本的隨機擾動時,離每個樣本都比較遠的劃分超平面對擾動的容忍能力比較強,即不容易因為樣本的隨機擾動使得樣本穿越到劃分超平面的另外一側而產生分類錯誤。因此這樣的劃分超平面對樣本比較穩健,不容易過擬合。另一方面,離各樣本都比較遠的劃分超平面不僅可以把正負樣本都分開,還可以比較大的確信度將所有樣本分開,包括難分的樣本,即離劃分超平面近的樣本。

  分類學習最基本的思想就是基於訓練集 D 在樣本空間中找到一個劃分超平面,將不同類別的樣本分開,但是能將訓練樣本分開的劃分超平面可能有很多,所有我們應該去找位於兩類訓練樣本“正中間”的劃分超平面。因為該劃分超平面對訓練樣本局部擾動的“容忍”性最好,例如,由於訓練集的局限性或者噪聲的因素,訓練集外的樣本可能比正中間的訓練樣本更接近於兩個類的分割界,這將使得許多劃分超平面出現錯誤。而正中間的超平面影響最小,所以這個劃分超平面所產生的結果是魯棒的。

  所以問題就變為哪一個分類超平面是最優的?而要算最優超平面,肯定先算出間隔,只有間隔最大化,才能找出最優超平面,所以下面學習函數間隔。

4,函數間隔 functional margin 與幾何間隔 geometrical  margin

  間隔(margin):每個訓練觀測點到超平面距離中的最小值。

  上面也提到了,我們的劃分超平面可以用如下線性方程來描述:

  其中W為法向量,決定了超平面的方向,b為位移量,決定了超平面與原點的距離。

  假設超平面能將訓練樣本正確的分類,即對訓練樣本(xi,  yi),滿足以下公式:

   該公式稱為最大間隔假設,yi = +1 表示樣本為正樣本,yi = -1 表示樣本為負樣本,式子前面選擇 >= +1, <= -1隻是為了方便計算,原則上可是任意常數,但無論是多少,都可以通過對 w 的變換使其為 +1 和 -1,實際上公式等價於:

  在超平面 w*x+b=0 確定的情況下, | w*x+b | 能夠表示點 x 到距離超平面的遠近,而通過觀察 w*x+b 的符號與類標記 y 的符號是否一致可以判斷分類是否正確,所以,可以用 (y * (w*x+b))的正負性來判定或表示分類的正確性。於此,我們便引出了函數間隔(functional margin)的概念。

  一般的,當樣本點被分類正確時,定義函數間隔(用 γ hat 表示)為:

   而超平面(w,  b)關於 訓練數據集T 中所有樣本點(xi , yi)的函數間隔最小值(其中, x是特徵, y是結果標籤,i表示第 i 個樣本),便為超平面(w,  b)關於訓練數據集T的函數間隔(即訓練觀測與超平面的間隔):

   但這樣定義的函數間隔有問題,即如果成比例的改變 w 和 b (假設將他們改為 2w 和 2b),則函數間隔的值 f(x) 卻變成了原來的 2 倍(雖然此時超平面沒有改變),所以引出真正定義點到超平面的距離——幾何間距(geometrical  margin)的概念。

  假定對於一個點 x,令其垂直投影到超平面上的對應點為 x0, w是垂直於超平面的一個向量,γ 為樣本 x 到超平面的距離,如下圖所示:

   根據平面幾何知識,有:

   其中 ||w|| 為 w 的二階范數(范數是一個類似於模的表示長度的概念),w / ||w|| 是單位向量(一個向量除以它的模稱之為單位向量)。

  又由於 x0 是超平面的點,滿足 f(x0) = 0,代入超平面的方差 wTx+b=0 ,可得 wTx0+b=0,即 wTx0 = -b。

  隨即讓上式(平面幾何所得公式)的兩邊同時乘以 WT,然後根據 wTx0 = -b 和 wTw = ||w||2,即可算出 γ :

   為了得到 γ 的絕對值,令 γ 乘上對應的類別 y,即可得出幾何間隔 (用 γ hat 表示)的定義:

   從上述函數間隔和幾何間隔的定義可以看出:幾何間隔就是函數間隔除以 ||w||,而且函數間隔  y * (w*x+b) = y * f(x) 實際上就是 | f(x) |,只是人為定義的一個間隔度量,而且幾何間隔 | f(x) | / || w || 才是直觀上的點到超平面的距離。

4.1 點到超平面的距離

  這裏補充一下點到超平面的距離的概念。設二維空間存在一個超平面實現二類可分如下圖所示:

  圖中的斜線表示超平面 g(x) = w*x + b = 0,二維平面上一點 X 在超平面的距離投影為 X’,則二者關係可表示為 X = X’ + λ w(w 表示超平面的梯度向量),將 X 代入到 g(x)得:

  點到超平面的距離即是 X 與 X’ 之間的距離:

  該公司為高等數學中點到平面的距離公式,只不過這裏點和平面表達式的係數都用向量表示了。而我們上面卻是使用函數間隔和幾何間隔的角度引入距離的。所以注意區分。

  我們使用PPT的內容表達如下:

5,最大間隔分類器 Maximum Margin Classifier 的定義

  最大間隔超平面:間隔最大的超平面,即使得訓練觀測到分割超平面的間隔達到最大。

  支持向量:樣本點中與分離超平面距離最近的樣本點的實例

  最大間隔超平面的選取只與支持向量有關

  對一個數據點進行分類,當超平面離數據點的“間隔”越大,分類的確信度(confidence)也越大。所以,為了使得分類的確信度盡量高,需要讓所選擇的超平面能夠最大化這個“間隔”值。這個間隔就是下面的Gap的一半。

   通過由前面的分析可知:函數間隔不適合用來最大化間隔值,因為在超平面固定以後,可以等比例地縮放 w 的長度和 b 的值,這樣可以使得 f(x) = wTx + b 的值任意大,亦即函數間隔 γ hat 可以在超平面保持不變的情況下被取得任意大。但幾何間隔因為除上了 ||w||,使得在縮放 w 和 b 的時候幾何間隔 γ hat 的值是不會改變的,它只隨着超平面的變動而變動。因此,這是更加合適的一個間隔。換言之,這裏要找的最大間隔分類超平面中的“間隔”指的是幾何間隔。

  於是最大間隔分類器(maximum  margin  classifier)的目標函數可以定義為: max  γ hat

  同時需要滿足一些條件,根據間隔的定義,有(下面兩個式子是等價的):

   其中,s.t 即subject to,它導出的是約束條件。

  即我們希望最大化超平面關於訓練集的間隔 γ ,約束條件表示的是超平面關於每個訓練樣本點的間隔至少是 γ

  回歸一下幾何間隔的定義:

   可知:如果令函數間隔 γ hat 等於1(之所以令 γ hat =1,是為了方便推導和優化,且這樣做對目標函數的優化沒有影響)則有 γ hat = 1 / || w || 且:

   從而上述目標函數轉換成了(即線性可分支持向量機模型的最優化問題):

   相當於在相應的約束條件下(約束條件為上上式子),最大化這個 1 / ||w|| 值,而 1 / ||w|| 便是幾何間隔 γ hat 。

  如下圖所示,中間的實線便是尋找到的最優超平面(optimal Hyper Plane),其到兩條虛線邊界的距離相等,這個距離便是幾何間隔 γ hat ,兩條虛線間隔邊界之間的距離等於  2*γ hat ,而虛線間隔邊界上的點則是支持向量。由於這些支持向量剛好在虛線間隔邊界上,所以他們滿足 y( wTx + b) = 1(還記得我們把functional margin 定位1了嗎?上面我們方便推導和優化的目的,我們可以令 γ hat = 1),而對於所有不是支持向量的點,則顯然有 y( wTx + b) > 1。

   所以線性可分支持向量機模型的最優化問題:

   這是一個凸二次規劃問題,若能求出(1)~(2)的解 w*, b*,那麼就可以得到最大間隔超平面 w*Tx + b = 0 t及分類決函數 f(x)

   其實到目前為止,對於只關心如何使用SVM的盆友便足夠了。可以不用深究其更深的原理了。而需要深究的話,那就接着來。

6,從線性可分到線性不可分

  支持向量機是一種二分類模型,他的目的是尋找一個超平面對樣本進行分割,分割的原則是間隔最大化,最終轉換為一個凸二次規劃問題來求解,而由簡至繁的模型包括:

  • 當訓練樣本線性可分時,通過硬間隔最大化,學習一個線性可分支持向量機
  • 當訓練樣本近似線性可分時,通過軟間隔最大化,學習一個線性支持向量機
  • 當訓練樣本線性不可分時,通過核技巧和軟間隔最大化,學習一個非線性支持向量機

  說這個的目的是什麼呢?就是我們上面一堆例子,通過線性可分的例子說明了支持向量機,要深入學習支持向量機,我們第一步肯定是從訓練樣本線性可分過渡到線性不可分。

  那我們接着從之前的目標函數說:

   由於求 1 / ||w|| 的最大值相當於求 1 /2  ||w||2 的最小值,所以上述目標函數等價於(w 由分母變為分子,從而也由原來的 max 問題變為 min 問題,很明顯,兩者問題等價):

  因為現在的目標函數是二次的,約束條件是線性的,所以它是一個凸二次規劃問題(這些我們上面均提到了)。那麼這個問題如何求解呢?

  可以用線程的QP(Quadratic Programming)優化包進行求解。簡單來說:就是在一定的約束條件下,目標最優,損失最小。

  此外,由於這個問題的特殊結構,還可以通過拉格朗日對偶性(Lagrange  Duality)變換到對偶變量(dual variable)的優化問題,即通過求解與原問題等價的對偶問題(dual problem)得到原始問題的最優解,這就是線性可分條件下支持向量機的對偶算法,這樣做的優點在於:一者對偶問題往往更容易求解;二者可以自然的引入核函數,進而推廣到非線性分類問題。

6.1整理一下我們的思緒

  這裏使用老師的PPT,整理一下我們對SVM的理解。

6.2  從原始問題到對偶問題的求解

  那麼什麼是拉格朗日對偶性呢?簡單來說,通過對每一個約束條件加上一個拉格朗日乘子(Lagrange multiplier)α,然後定義出拉格朗日函數(通過拉格朗日函數將約束條件融合到目標函數里去,從而只用一個函數表達式便能清楚的表達出我們的問題)

  然後令:

   而當所有約束條件都滿足時,則最優值為:

   上式最優值即最初要最小化的量,所以在要求約束條件得到滿足的情況下最小化  1 /2  ||w||2 ,實際上等價於直接最小化 Θ(w) (當然,這裏也有約束條件(即KKT條件的約束),就是 αi >= 0, i=1,….n),容易驗證,當某個約束條件不滿足時,例如 yi * (w*xi + b) < 1,那麼顯然有 Θ(w) = ∞(只要令 αi = ∞ 即可)

  具體寫出來,目標函數變成了:

   這裏用 P* 表示這個問題的最優解,且和最初的問題是等價的。如果直接求解,那麼一上來便得面對 w  和 b 這兩個參數,而 αi 又是不等式約束,這個求解過程不好做。不妨把最小和最大的位置交換一下,變成:

  交換以後的新問題是原始問題的對偶問題,這個新問題的最優值用 d* 來表示。而且有 d* <= p*,在滿足某些條件的情況下,這二者等價,這時候就可以通過求解對偶問題來間接地求解原始問題。

  換言之,之所以從 min  max 的原始問題 p*,轉換為 max min 的對偶問題 d*,一者是因為 d* 是 p* 的近似解,二者轉換為對偶問題后,更容易求解。

  所以下面可以先求 L 對w, b的極小,再求 L 對 α  的極大。

   上面提到了 d* <= p* 在滿足某些條件的情況下,二者等價,而要讓兩者等價需滿足 strong  duality(強對偶),而後有學者在強對偶下提出了KKT條件,且KKT條件的成立要滿足 constraint qualifications,而 constraint qualifications 之一就是  Slater條件。所謂的Slater條件,即指:凸優化問題,如果存在一個點 x,使得所有等式約束都成立,並且所有不等式約束都嚴格成立(即取嚴格不等號,而非等號),則滿足Slater條件。對於此處,Slater條件成立,所以 d* <= p* 可以取等號。

  一般的,一個最優化數學模型能夠表示成下列標準形式:

  其中f(x)是需要最小化的函數,h(x)是等式約束,g(x)是不等式約束,p和q分別為等式約束和不等式約束的數量。

  同時,得明白以下兩點:

   而KKT的條件就是指上面最優化數學模型的標準形式中的最小點 x* 必須滿足下面的條件:

   經過論證,我們這裏的問題是滿足KKT條件的(首先已經滿足Slater條件,再者 f 和 gi 也都是可微的,即 L 對 w 和 b 都可導),因此現在我們便轉換為求解第二個問題。

  也就是說原始問題通過滿足KKT條件,已經轉換成了對偶問題。而求解這個對偶學習問題,分為三個步驟:

  • 1,要讓 L(w, b, a) 關於 w 和 b 最小化,
  • 2,求 對 α 的極大
  • 3,利用SMO算法求解對偶問題中的拉格朗日乘子

6.3 對偶問題求解的三個步驟

  根據拉格朗日的對偶性,原始問題的對偶問題是極大極小問題,所以我們求解對偶問題的步驟如下:

  (1)首先固定 α,要讓 L 關於 w 和 b 最小化,我們分別對 w, b 求偏導數,即令  ∂L / ∂w 和 ∂L / ∂b 等於零:

  將求偏導數的結果,代入下式:

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

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

  得到:

   推導過程如下:

   最後,得到:

   上面推導過程中,“倒數第4步” 推導到  “倒數第3步” 使用了線性代數的轉置運算,由於 ai 和 yi 都是實數,因此轉置后與自身一樣。“倒數第3步” 推導到“倒數第2步” 使用了(a + b + c + …)(a + b + c + …) = aa + ab + ac +ba +bb + bc + … 的乘法法則。最後一步是上一步的順序調整。

  從上面的最後一個式子,我們可以看出,此時的拉格朗日函數只包含一個變量,那就是 αi 便能求出 w 和 b,由此可見,上面提出來的核心問題:分類函數  f(x) = wTx + b 也可以輕而易舉的求出來。

  (2)對 α 的極大,即是關於對偶問題的最優化問題。經過上面第一個步驟的求 w 和 b,得到的拉格朗日函數式子已經沒有變量 w,  b ,只有 α 。從上面的式子得到:

   這樣,求出了 αi ,根據上面對 w 求偏導的式子,我們可以求出 w。然後通過下面式子,可以求出b,最終得到分離超平面和分類決策函數:

   (3)在求得 L(w,  b,  a) 關於 w 和 b 最小化,以及對  α 的極大值后,最後一步則可以利用 SMO 算法求解對偶問題中的拉格朗日乘子  α。

  我們需要構造並求解對偶約束最優化問題

   上述式子要解決的是在參數 {α1, α2, α3,…..αn} 上求最大值 W的問題,至於 x(i) 和 y(i) 都是已知數。要了解這個SMO算法如何推導,後面繼續學。

6.4 拉格朗日乘子法求解SVM

  這裏繼續使用老師的PPT對SVM的推導做一個梳理,其實就是整理上面6.2  6.3 小節的內容。

7,從線性不可分到非線性問題

  為了過渡到非線性分類情況,我們先看看上述推導過程中得到的一些有趣的形式。

  首先就是關於我們的 hyper plane,對於一個數據點 x 進行分類,實際上是通過把 x 代入到   f(x) = wTx + b 算出結果然後根據其正負號來進行類別劃分的。而前面的推導,我們得出:

  因此分類函數為:

   這裏的形式的有趣之處在於,對於新點 x 的預測,只需要計算它與訓練數據點的內積即可( < ·,  ·>表示向量內積),這一點直觀重要,是之後使用Kernel進行非線性推廣的基本前提。此外,所謂 Supporting  Vector 也在這裏显示出來——事實上,所謂非 Supporting Vector所對應的係數 α 都是等於零的,因此對於新點的內積計算實際上只需要針對少量的“支持向量” 而不是所有的訓練數據即可。

  為什麼非支持向量對應的  α 等於零呢?直觀上來看理解的話,就是這些“後方”的點——正如我們之前分析過一樣,對超平面是沒有影響的,由於分類完全由超平面決定,所以這些無關的點並不會參与分類問題的計算,因而也就不會產生任何影響了。

  首先,我們看看通過Lagrange multiplier 得到的目標函數:

   注意到如果 xi 是支持向量的話,上式中紅顏色的部分是等於0 的(因為支持向量的 functional margin 等於1),而對非支持向量來說,functional margin 會大於 1,因此紅顏色部分是大於零的,而 αi 又是非負的,為了滿足最大化,  αi 必須等於0。這也就是這些非 supporting vector 的局限性。

   至此,我們便得到了一個 maximum  margin hyper plane classifier,這就是所謂的支持向量機(Support Vector Machine)。當然,,到目前為止,我們的SVM還比較弱,只能處理線性的情況,不過,在得到了對偶 dual 形式之後,通過 Kernel推廣到非線性的情況就變成了一件非常容易的事情了(我們之前說過:通過求解對偶問題得到最優解,這就是線性可分條件下支持向量機的對偶算法,這樣做的優點在於:一者對偶問題往往更容易求解;二者可以自然的引入核函數,進而推廣到非線性分類問題)。

8,從線性不可分到特徵空間映射與核函數問題——線性不可分支持向量機

8.1 線性不可分

  線性不可分定義如下圖:

   對於上圖的二分類數據點,普通線性分類器不行,最大間隔超平面和軟間隔超平面也無能為力。面對這樣的線性不可分問題,通常的思路是找一個非線性分類邊界(比如組合分類器)來實現分類,而SVM則另闢蹊徑,將數據點從原始空間映射到特徵空間,而數據在特徵空間往往就能實現線性可分。

8.2 特徵空間映射

  對於非線性問題,線性可分支持向量機並不能有效解決,要使用非線性模型才能很好的分類。

  • 一維空間向二維空間映射

  下面我們考慮一維空間的二分類問題:

   我們將它進行一個二次變換,換到二維空間,這裏的變換為 x -> x2

   從上面的例子,我們知道變換的核心思想就是:將原始輸入空間的數據集映射到高維特徵空間中,從而使得數據集可分

  • 二維空間向二維特徵空間映射

  上圖中二維空間不可分,但是變換一下坐標空間,也能實現線性可分。

  • 二維空間向三維空間的映射

 

  二維空間的數據點不僅可以映射到二維空間,同樣也可以映射到三維,如上所示,所以同樣可以找到一個超平面能夠實現在三維空間的線性可分。

   首先將原始的輸入特徵通過函數 h(xi) 映射到高維空間,拉格朗日對偶有如下形式:

   決策函數為:

8.3  核函數

  原始空間向特徵空間的映射需要藉助映射函數 Ψ(x)。例如對於數據點 xi,映射到特徵空間就變成了Ψ(xi)。而SVM的一大巧妙之處就是映射后的特徵空間數據點內積的計算等價於低維空間數據點在映射函數對應的核函數中計算。這大大降低了運算量,因為有的時候高維空間的計算很複雜,下圖是一個將 m 維度向量的映射到特徵空間的映射函數的例子:

  映射后的維度大概是 m^2 / 2 維,則計算映射后的數據內積 Ψ(xi)T*Ψ(xj) 的時間複雜度為 O(n^2)。而如果使用核函數,則計算複雜度會降低為 O(n),例如:

   其中 a,b為 m維的向量,Ψ(a) 為 a 經過上面的映射函數后的 m^2 / 2維向量,可以看出核函數 K(a, b) = (aT*b + 1)2 計算的時間複雜度為 O(n)。

   核函數是指:設從輸入空間 Χ 到特徵空間 H的一個映射 h,對任意 x, z 屬於 X,函數 K(x,  z) 滿足 K(x,  z) = (h(x),  h(z)),則稱 K 為核函數。

  具體的核函數,我們下一節完整介紹,這裏不再贅述。

  核技巧:在學習與預測中只定義核函數,而不显示的定義映射函數 h。

   通常,直接計算 K(x, z)比較容易,而通過 h(x) 和 h(z) 計算 K(x, z)並不容易。

  而成為核函數的充要條件:設 K 是對稱函數,則 K(x, z)為核函數的充要條件是對輸入空間中任意xi,i=1,2,….m,Gram矩陣K = [K(xi, xj)] m * m 是半正定矩陣。

  對偶問題的目標函數:

   決策函數的形式:

   對SVM從簡到難的介紹就到這裏,然後下一篇文章主要學習核函數的問題,下下一篇對使用Sklearn實現SVM進行了解,最後我們證明一下SVM。這個系列就算結束。可能這一個多月的整理,我不是百分百理解它,但是我相信這是我理解它的開始。

9,從線性不可分到軟間隔問題——使用鬆弛變量處理 outliers(軟間隔支持向量機)

  軟間隔(soft-margin):有時候數據中有一些噪音點,如果我們考慮他們,那麼我們的分割超平面就不太好了。

  在之前討論支持向量機的時候,我們就假定,數據是線性可分的,即我們可以找到一個可行的超平面將數據完全分開。後來為了處理非線性數據,在下文使用 Kernel 方法對原來的線性 SVM 進行了推廣,使得非線性的情況也能處理。雖然通過映射 Φ(•) 將原始數據映射到高維空間之後,能夠線性分隔的概率大大增加,但是對於某些情況還是很難處理。

  例如可能並不是因為數據本身是非線性結構的,而只是因為數據有噪音。對於這種偏離正常位置很遠的數據點,我們稱之為 outlier,在我們原來的SVM模型里,outlier的存在有可能造成很大的影響,因為超平面本身就是只有少數幾個 support vector 組成的,如果這些 support vector里又存在 outliers 的話,其影響就很大了。例如下圖:

  用黑圈圈起來的那個藍點是一個 outlier,它偏離了自己原本應該在的那個半空間,如果直接忽略掉它的話,原來的分割超平面還是挺好的,但是由於這個 outlier 的出現,導致分割超平面不得不被擠歪了,變成途中黑色虛線所示(這隻是一個示意圖,並沒有嚴格計算精確坐標),同時 margin 也相應變小了。當然,更嚴重的情況是,如果這個 outlier 再往右上移動一些距離的話,我們將無法構造出能將數據分開的超平面來。

  為了處理這種情況,SVM 允許數據點在一定程度上偏離一下超平面。例如上圖中,黑色實線所對應的距離,就是該 outlier 偏離的距離,如果把它移動回來,就剛好落在原來的超平面藍色間隔邊界上,而不會使得超平面發生變形了。

  也就是說,在有鬆弛的情況下 outline 點也屬於支持向量SV,同時,對於不同的支持向量,拉格朗日參數的值也不同,如此篇論文 《Large  Scale Machine Learning》中的下圖所示:

  對於遠離分類平面的點值為0;對於邊緣上的點值在 [0, 1/L],其中,L為訓練數據集個數,即數據集大小;對於 outline  數據和內部的數據值為 1/L。

  OK,繼續回到問題,我們原來的約束條件為:

   現在考慮到 outlier 問題,約束條件變成了:

   其中,ξi >= 0 稱為鬆弛變量(slack  variable),對應數據點 xi 允許偏離的 functional  margin 的量。當然,如果我們運行 ξi 任意大的話,那任意的超平面都是符合條件的了。所以,我們在原來的目標函數後面加上一項,使得這些 ξi 的總和也要最小,即軟間隔支持向量機的學習問題如下(原始問題):

   其中 C是懲罰係數,用於控制目標函數中兩項(“尋找 margin 最大的超平面” 和 “保證數據點偏差量最小”)之間的權重。注意,其中 ξ 是需要優化的變量(之一),而 C 是一個事先確定好的常量C值大時對誤分類的懲罰增加(C趨於很大時,意味着分類嚴格不能有錯誤),C值小時對誤分類的懲罰減小(C趨於很小時,意味着可以有更大的錯誤容忍)。完整的寫出來是這個樣子:

  所以上式包含兩層含義,使  ||w||2/2 盡量小即間隔盡量大,同時使誤分類點的個數盡量小,C是調和兩者的係數,有了上式,就可以和線性可分支持向量機一樣考慮線性可分支持向量機一樣考慮線性支持向量機的學習過程,此時,線性不可分支持向量機的學習問題可以變為之前的凸二次規劃問題的求解。

   用之前的方法將限制或約束條件加入到目標函數中,得到新的拉格朗日函數,如下所示:

  約束如下:

   分析方法和前面一樣,轉換為另一個問題之後,解法類似,我們先讓 L 針對 w,  b 和 ξ 最小化:

   將 w 帶回 L 並化簡,得到和原來一樣的目標函數:

   不過由於我們得到 C – αi – ri = 0 而 又有 ri >= 0 (作為 Lagrange multiplier 的條件),因此有 αi <= C,所以整個 dual 問題現在寫作:

   把前後的結果對比一下:

   可以看到唯一的區別就是現在 dual  varibale α 多了一個上限 C。而 Kernel 化的非線性形式也是一樣的,只要把 <xi,  xj> 換成 k(xi,  xj)即可。這樣一來,一個完整的可以處理線性和非線性並能容忍噪音和 outliers 的支持向量機就介紹完畢了。

  所以可以做一個總結,不準確的說:SVM它本質上是一個分類方法,用 WT+b 定義分類函數,於是求 w,b為尋最大間隔,引出 1 / 2 || w || ^2,繼而引入拉格朗日因子,化為對拉格朗日乘子a 的求解(求解過程中會設計一系列的最優化或凸二次規劃等問題),如此,求 w.b 與 求 a 等價,而 a 的求解可以用一種快速學習算法 SMO,至於核函數,是為了處理非線性問題,若直接映射到高維計算恐維度爆炸,故在低維計算,等效高維表現。

10,支持向量機(SVM)的優缺點

  支持向量機(SVM)是一組用於分類,回歸和異常值檢測的監督學習方法。

10.1  支持向量機(SVM)的優點:

  • 在高維空間有效
  • 在維度數量大於樣本數量的情況下仍然有效
  • 在決策功能(稱為支持向量)中使用訓練點的子集,因此他也是內存有效的
  • 多功能:可以為決策功能指定不同的內核函數。提供通過內核,也可以指定自定義內核

10.2  支持向量機(SVM)的缺點:

  • 如果特徵數量遠遠大於樣本數量,則該方法可能會導致交叉的性能
  • 支持向量機不直接提供概率估計,這些是使用昂貴的五折交叉驗證計算的

 

知識儲備1:什麼叫凸優化?

  我們可以看到,上麵線性可分支持向量機模型的最優化問題如下:

   上面的基本型目標函數是二次的,約束條件是線性的,這是一個凸二次規劃問題。可以直接用現成的優化計算包求解。但若利用“對偶問題”來求解,會更高效。

  • 啥是凸?什麼是凸優化?

  凸優化說的是這樣一回事情:

   凸優化可以想象成給我一個凸函數,我們需要找最低點。

  • 為啥叫二次規劃問題呢?

  據了解。目標函數和約束條件都為變量的線性函數,叫做——線性規劃問題。目標函數為變量的二次函數和約束條件為變量的線性函數,叫做二次規劃問題。

   拉格朗日對偶性,即通過給每一個約束條件加上一個拉格朗日乘子。然後定義出拉格朗日函數,通過拉格朗日函數將約束條件融合進目標函數中。目的是,只需要通過一個目標函數包含約束條件,便可以解釋清楚問題。

知識儲備2:有約束最優化問題的數學模型

   SVM 問題是一個不等式約束條件下的優化問題。絕大多數模式識別教程在討論這個問題時都會加上優化算法的簡介。

2.1  有約束優化問題的幾何意向

  約束條件一般分為等式約束和不等式約束,前者表示為 g(x) = 0 ;後者表示為 g(x) <= 0、

  假設 x 屬於 Rd(就是這個向量一共有 d 個標量組成),則 g(x) = 0 則是由 d-1 維的超平面。那麼有約束優化問題就要求在這個 d-1 維的曲面或者超平面上找到能使得目標函數最小的點,這個 d-1 維的曲面就是“可行解區域”。

  對於不等式約束條件, g(x) <= 0 ,則可行解區域 d-1 維曲面擴展成 d 維空間的一個子集。我們可以從  d=2 的二維空間進行比對理解。等式約束對應的可行解空間就是一條線;不等式約束對應的則是這條線以及線的某一側對應的區域,就像下面的這幅圖(圖中的模板函數等高線其實就是等值線,在同一條等值線上的點對應的目標函數值相等)。

2.2  拉格朗日乘子法

  儘管上面我們已經想象出有約束優化問題的幾何意向。可是如何利用代數方法找到這個被約束了的最優解呢?這就需要用到拉格朗日乘子法。

  首先定義原始目標函數 f(x),拉格朗日乘子法的基本思想是把約束條件轉換為新的目標函數 L(x,  λ) 的一部分,從而使有約束優化問題變成我們習慣的無約束優化問題,那麼該如何去改造原來的目標函數 f(x),使得新的目標函數 L(x,  λ)  的最優解恰好在可行解區域中呢?這就需要我們去分析可行解區域的最優解的特點。

知識儲備3:KKT條件

   KKT條件是一個線性規劃問題能有最優解的充分和必要條件。

  對於不等式約束條件 g(x) <= 0 的情況,如下圖所示,最優解所在的位置 x* 有兩種可能,或者在邊界曲線 g(x)=0 上或者在可行解區域內部滿足不等式 g(x) < 0 的地方。

  第一種情況:最優解在邊界上,就相當於約束條件就是 g(x) = 0.參考下圖,注意此時的目標函數 f(x) 的最優解是在可行解區域外面,所以函數 f(x) 在最優解 x* 附加的變化趨勢是“在可行解區域內側較大而在區域外側較小”,與之對應的是函數 g(x) 在可行解區域內小於 0 ,在區域外大於零,所以在最優解 x* 附加的變換趨勢是內部較小而外部較大。這意味着目標函數 f(x) 的梯度方向與約束條件函數 g(x) 的梯度方向相反。因此根據下式,可以推斷出參數 λ > 0。

   一般的,一個最優化數學模型可以表示成如下形式:

   h(x) 是等式約束,g(x)是不等式約束,p, q表示約束的數量。

  而這個最優化數學模型的最優解 x* 需滿足的條件(即KTT條件)為:

  可能上面這樣說,大家還是有點模糊,我代入SVM中來看。

  對於帶等式和不等式的約束問題,在最優點處必須滿足KKT條件,將KKT條件應用於SVM原問題的拉格朗日乘子函數,得到關於所有變量的方程,對於原問題中的兩組不等式約束,根據KKT條件必須滿足(和上面的一樣):

  對於第一個方程,第一種情況:如果 αi > 0,則必須有:

   即:

  而由於 ξi  >= 0,因此必定有:

   再來看第二種情況:如果αi = 0,則對

  的值沒有約束。由於有 αi + βi = C 的約束,因此 βi = C ,又因為 βiξi = 0 的限制,如果 βi >0,則必須有 ξi = 0。由於原問題中有約束條件:

  而由於 ξi = 0,因此有

  最後第三種情況:對於 αi > 0 的情況,我們又可以細分為 αi < C  αi = C 的情況。如果 αi < C  ,由於有 αi + βi = C 的約束,因此有 βi > 0;因為有 βiξi = 0 的約束,因此有 ξi = 0。不等式約束:

   變為:

   由於 0 <  αi < C 時,既要滿足:

  又要滿足:

   因此有:

   將三種情況合併起來,在最優點,所有樣本都必須滿足:

   上面第一種情況對應的是自由變量即非支持向量,第二種情況對應的是支持向量,第三種情況對應的是違反不等式約束的樣本。在SMO算法求解中,會應用此條件來選擇優化變量。

 

 

參考文獻:

https://zhuanlan.zhihu.com/p/31652569

https://zhuanlan.zhihu.com/p/57648645

http://www.360doc.com/content/18/0727/00/7669533_773495537.shtml

https://mp.weixin.qq.com/s/ZFWJUazMbAqeoSIkXjuG5g

https://blog.csdn.net/qq_35992440/article/details/80987664

https://zhuanlan.zhihu.com/p/24638007

https://blog.csdn.net/weixin_40170902/article/details/80113128

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

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

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

MyBatis緩存特性詳解_包裝設計

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

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

緩存簡介

一般我們在系統中使用緩存技術是為了提升數據查詢的效率。當我們從數據庫中查詢到一批數據后將其放入到混存中(簡單理解就是一塊內存區域),下次再查詢相同數據的時候就直接從緩存中獲取數據就行了。這樣少了一步和數據庫的交互,可以提升查詢的效率。

但是一個硬幣都具有兩面性,緩存在帶來性能提升的同時也“悄悄”引入了很多問題,比如緩存同步、緩存失效、緩存雪崩等等。當然這些問題不是本文討論的重點。

本文主要討論MyBatis緩存這個比較雞肋的功能。雖然說MyBatis的緩存功能比較雞肋,但是為了全面了解MyBatis這個框架,學習下緩存這個功能還是挺有必要的。MyBatis的緩存分為一級緩存和二級緩存,下面就分別來介紹下這兩個特性。

一級緩存

在應用運行過程中,我們有可能在一次數據庫會話中,執行多次查詢條件完全相同的SQL,MyBatis提供了一級緩存的方案優化這部分場景,如果是相同的SQL語句,會優先命中一級緩存,避免直接對數據庫進行查詢,提高性能。

什麼是MyBatis一級緩存

一級緩存是 SqlSession級別 的緩存。在操作數據庫時需要構造 sqlSession 對象,在對象中有一個(內存區域)數據結構(HashMap)用於存儲緩存數據。不同的 sqlSession 之間的緩存數據區域(HashMap)是互相不影響的。

在應用運行過程中,我們有可能在一次數據庫會話中,執行多次查詢條件完全相同的SQL,MyBatis 提供了一級緩存的方案優化這部分場景,如果是相同的SQL語句,會優先命中一級緩存,避免直接對數據庫進行查詢,提高性能。

怎麼開啟一級緩存

MyBatis中一級緩存默認是開啟的,不需要我們做額外的操作。

如果你需要關閉一級緩存的話,可以在Mapper映射文件中將flushCache屬性設置為true,這種做法只會針對單個SQL操作生效

<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap" flushCache="true">
    select 
    <include refid="Base_Column_List" />
    from cbondissuer
    where OBJECT_ID = #{objectId,jdbcType=VARCHAR}
  </select>
> 還有一種做法是在MyBatis的主配置文件中,關閉所有的一級緩存
> ```xml
>   默認是SESSION,也就是開啟一級緩存
>   <setting name="localCacheScope" value="STATEMENT"/>
> ```

下面我們來寫代碼驗證下MyBatis的一級緩存。

```java
String id = "123";
SqlSession sqlSession1 = sqlSessionFactory.openSession();
SqlSession sqlSession2 = sqlSessionFactory.openSession();
//同一個sqlSession創建的Mapper
CbondissuerMapper cbondissuerMapper10 = sqlSession1.getMapper(CbondissuerMapper.class);
CbondissuerMapper cbondissuerMapper11 = sqlSession1.getMapper(CbondissuerMapper.class);
//另外一個sqlSession創建的Mapper
CbondissuerMapper cbondissuerMapper20 = sqlSession2.getMapper(CbondissuerMapper.class);

//同一個Mapper,同樣的SQL查了兩次
Cbondissuer cbondissuer10 = cbondissuerMapper10.selectByPrimaryKey(id);
Cbondissuer cbondissuer101 = cbondissuerMapper10.selectByPrimaryKey(id);
//同一個sqlSession創建的Mapper,又查詢了一次同樣的SQL
Cbondissuer cbondissuer11 = cbondissuerMapper11.selectByPrimaryKey(id);
//不一樣的sqlSession創建的Mapper查詢了一次同樣的SQL
Cbondissuer cbondissuer20 = cbondissuerMapper20.selectByPrimaryKey(id);

System.out.println("cbondissuer10 equals cbondissuer101 :"+(cbondissuer10==cbondissuer101));
System.out.println("cbondissuer10 equals cbondissuer11 :"+(cbondissuer10==cbondissuer11));
System.out.println("cbondissuer10 equals cbondissuer21 :"+(cbondissuer10==cbondissuer20));

sqlSession1.close();
sqlSession2.close();
System.out.println("end...");

上面進行了四次查詢,如果你觀察日誌的話。會發現只進行了兩個數據庫查詢。因為第二和第三次的查詢都查詢了一級緩存,查出的其實是緩存中的結果。所以輸出的結果是

cbondissuer10 equals cbondissuer101 :true
cbondissuer10 equals cbondissuer11 :true
cbondissuer10 equals cbondissuer21 :false

哪些因素會使一級緩存失效

上面的一級緩存初探讓我們感受到了 MyBatis 中一級緩存的存在,那麼現在你或許就會有疑問了,那麼什麼時候緩存失效呢?

  • 通過同一個SqlSession執行更新操作時,這個更新操作不僅僅指代update操作,還指插入和刪除操作;
  • 事務提交時會刪除一級緩存;
  • 事務回滾時也會刪除一級緩存;

一級緩存源碼解析

其實MyBatis一級緩存的實質就是一個Executor的一個類似Map的屬性,分析源碼的方法就是看在哪些地方從這個Map中查詢了緩存,又是在哪些清空了這些緩存。

1. 查詢時使用緩存分析

public abstract class BaseExecutor implements Executor {

  private static final Log log = LogFactory.getLog(BaseExecutor.class);

  protected Transaction transaction;
  protected Executor wrapper;

  protected ConcurrentLinkedQueue<DeferredLoad> deferredLoads;
  //這個localCache變量就是一級緩存變量
  protected PerpetualCache localCache;
  protected PerpetualCache localOutputParameterCache;
  protected Configuration configuration;
  //..省略下面代碼
}

全局搜索代碼中哪些地方使用了這個變量,很容易找到BaseExecutor.query方法使用了這個緩存:

public abstract class BaseExecutor implements Executor {

// 省略其他代碼
 public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
    ErrorContext.instance().resource(ms.getResource()).activity("executing a query").object(ms.getId());
    if (closed) {
      throw new ExecutorException("Executor was closed.");
    }
    if (queryStack == 0 && ms.isFlushCacheRequired()) {
      clearLocalCache();
    }
    List<E> list;
    try {
      queryStack++;
      //先從緩存中查詢結果,如果緩存中已經存在結果直接使用緩存的結果
      list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;
      if (list != null) {
        handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);
      } else {
        //緩存中沒有結果從數據庫查詢
        list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
      }
    } finally {
      queryStack--;
    }
    if (queryStack == 0) {
      for (DeferredLoad deferredLoad : deferredLoads) {
        deferredLoad.load();
      }
      // issue #601
      deferredLoads.clear();
      if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT) {
        // issue #482
        clearLocalCache();
      }
    }
    return list;
  }
  //..省略下面代碼
}

上面的代碼展示了,BaseExecutor的query方法使用緩存的過程。需要注意的是查詢緩存時是根據cacheKey進行查詢的,我們可以將這個key簡單的
理解為sql語句,不同的sql語句能查出不同的緩存。(注意sql語句中的參數不同也會被認為是不同的sql語句)。

2. 導致一級緩存失效的代碼分析
查看BaseExecutor的代碼,我們很容易發現是下面的方法清空了一級緩存。(不要問我是怎麼發現這個代碼的,看代碼能力需要自己慢慢提升)

@Override
public void clearLocalCache() {
    if (!closed) {
        localCache.clear();
        localOutputParameterCache.clear();
    }
}

那麼我們只要查看哪些地方調用了這個方法就知道哪些情況下會導致一級緩存失效了。跟蹤下來,最後發現下面三處地方會使得一級緩存失效

BaseExecutor的update方法,使用MyBatis的接口進行增、刪、改操作都會調用到這個方法,這個也印證了上面的說法。

@Override
  public int update(MappedStatement ms, Object parameter) throws SQLException {
    ErrorContext.instance().resource(ms.getResource()).activity("executing an update").object(ms.getId());
    if (closed) {
      throw new ExecutorException("Executor was closed.");
    }
    clearLocalCache();
    return doUpdate(ms, parameter);
  }

BaseExecutor的commit方法,事務提交會導致一級緩存失敗。如果我們使用Spring的話,一般事務都是自動提交的,所以好像MyBatis的一級緩存一直沒怎麼被考慮過

@Override
  public void commit(boolean required) throws SQLException {
    if (closed) {
      throw new ExecutorException("Cannot commit, transaction is already closed");
    }
    clearLocalCache();
    flushStatements();
    if (required) {
      transaction.commit();
    }
  }

BaseExecutor的rollback方法,事務回滾也會導致一級緩存失效。

@Override
  public void rollback(boolean required) throws SQLException {
    if (!closed) {
      try {
        clearLocalCache();
        flushStatements(true);
      } finally {
        if (required) {
          transaction.rollback();
        }
      }
    }
  }

一級緩存使用建議

平時使用MyBatis時都是和Spring結合使用的,在整個Spring容器中一般只有一個SqlSession實現類。而Spring一般都是主動提交事務的,所以說一級緩存經常失效。

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

還有就是我們也很少在一個事務範圍內執行同一個SQL兩遍,上面的這些原因導致我們在開發過程中很少注意到MyBatis一級緩存的存在。

不怎麼用並不是說不用,作為一個合格的開發者需要對這些心知肚明,要清楚的知道MyBatis一級緩存的工作流程。

二級緩存

什麼是MyBatis二級緩存

MyBatis 一級緩存最大的共享範圍就是一個SqlSession內部,那麼如果多個 SqlSession 需要共享緩存,則需要開啟二級緩存,開啟二級緩存后,會使用 CachingExecutor 裝飾 Executor,
進入一級緩存的查詢流程前,先在CachingExecutor 進行二級緩存的查詢,具體的工作流程如下所示:

當二級緩存開啟后,同一個命名空間(namespace) 所有的操作語句,都影響着一個 共同的 cache(一個Mapper映射文件對應一個Cache),也就是二級緩存被多個 SqlSession 共享,是一個全局的變量。當開啟緩存后,數據的查詢執行的流程就是 二級緩存 -> 一級緩存 -> 數據庫。

從上面的圖可以看出,MyBatis的二級緩存實現可以有很多種,可以是MemCache、Ehcache等。也可以是Redis等,但是需要額外的Jar包。

怎麼開啟二級緩存

二級緩存默認是不開啟的,需要手動開啟二級緩存,實現二級緩存的時候,MyBatis要求返回的POJO必須是可序列化的。開啟二級緩存的條件也是比較簡單,

step1:通過直接在 MyBatis 配置文件中通過

<settings>  
	<setting name = "cacheEnabled" value = "true" />
</settings>

step2: 在 Mapper 的xml 配置文件中加入 標籤

cache標籤下面有下面幾種可選項

  • eviction: 緩存回收策略,支持的策略有下面幾種

    • LRU – 最近最少回收,移除最長時間不被使用的對象(默認是這個策略)
    • FIFO – 先進先出,按照緩存進入的順序來移除它們
    • SOFT – 軟引用,移除基於垃圾回收器狀態和軟引用規則的對象
    • WEAK – 弱引用,更积極的移除基於垃圾收集器和弱引用規則的對象
  • flushinterval:緩存刷新間隔,緩存多長時間刷新一次,默認不清空,設置一個毫秒值;

  • readOnly: 是否只讀;true 只讀 ,MyBatis 認為所有從緩存中獲取數據的操作都是只讀操作,不會修改數據。MyBatis 為了加快獲取數據,直接就會將數據在緩存中的引用交給用戶。不安全,速度快。讀寫(默認):MyBatis 覺得數據可能會被修改

  • size : 緩存存放多少個元素

  • type: 指定自定義緩存的全類名(實現Cache 接口即可)

  • blocking:若緩存中找不到對應的key,是否會一直blocking,直到有對應的數據進入緩存。

cache-ref代表引用別的命名空間的Cache配置,兩個命名空間的操作使用的是同一個Cache。

哪些因素會使二級緩存失效

從上面的介紹可以知道MyBatis的二級緩存主要是為了SqlSession之間共享緩存設計的。但是我們平時開發過程中都是結合Spring來進行MyBatis的開發。在Spring環境下一般也只有一個SqlSession實例,所以二級緩存使用到的機會不多。所以下面就簡單描述下Mybatis的二級緩存。

還是以上面的列子為列

String id = "{0003CCCA-AEA9-4A1E-A3CC-06D884BA3906}";
SqlSession sqlSession1 = sqlSessionFactory.openSession();
SqlSession sqlSession2 = sqlSessionFactory.openSession();
//同一個sqlSession創建的Mapper
CbondissuerMapper cbondissuerMapper10 = sqlSession1.getMapper(CbondissuerMapper.class);
CbondissuerMapper cbondissuerMapper11 = sqlSession1.getMapper(CbondissuerMapper.class);
//另外一個sqlSession創建的Mapper
CbondissuerMapper cbondissuerMapper20 = sqlSession2.getMapper(CbondissuerMapper.class);

//同一個Mapper,同樣的SQL查了兩次
Cbondissuer cbondissuer10 = cbondissuerMapper10.selectByPrimaryKey(id);
Cbondissuer cbondissuer101 = cbondissuerMapper10.selectByPrimaryKey(id);
//同一個sqlSession創建的Mapper,又查詢了一次同樣的SQL
Cbondissuer cbondissuer11 = cbondissuerMapper11.selectByPrimaryKey(id);
//這邊需要提交事務才能讓二級緩存生效
sqlSession1.commit();
//不一樣的sqlSession創建的Mapper查詢了一次同樣的SQL
Cbondissuer cbondissuer20 = cbondissuerMapper20.selectByPrimaryKey(id);

System.out.println("cbondissuer10 equals cbondissuer101 :"+(cbondissuer10==cbondissuer101));
System.out.println("cbondissuer10 equals cbondissuer11 :"+(cbondissuer10==cbondissuer11));
System.out.println("cbondissuer10 equals cbondissuer21 :"+(cbondissuer10==cbondissuer20));
  • 二級緩存是以namespace(Mapper)為單位的,不同namespace下的操作互不影響。
  • insert,update,delete操作會清空所在namespace下的全部緩存。
  • 多表操作一定不要使用二級緩存,因為多表操作進行更新操作,一定會產生臟數據。

二級緩存使用建議

個人覺得MyBatis的二級緩存實用性不是很大。一個原因就是Spring環境下,一本只有一個SqlSession,不存在sqlSession之間共享緩存;還有就是
MyBatis的緩存都不能做到分佈式,所以對於MyBatis的二級緩存以了解為主。

簡單總結

一級緩存

  • 一級緩存的本質是Executor的一個類似Map的屬性;
  • 一級緩存默認開啟,將flushCache設置成true或者將全局配置localCacheScope設置成Statement可以關閉一級緩存;
  • 在一級緩存開啟的情況下,查詢操作會先查詢一級緩存,再查詢數據庫;
  • 增刪改操作和事務提交回滾操作會導致一級緩存失效;
  • 由於Spring中事務是自動提交的,因此Spring下的MyBatis一級緩存經常失效。(但是並不表示不生效,除非你手動關閉一級緩存)
  • 不能實現分佈式。

二級緩存

  • namesapce級別的緩存(Mapper級別或者叫做表級別的緩存),設計的主要目的是實現sqlSession之間的緩存共享;
  • 開啟二級緩存后,查詢的邏輯是二級緩存->已經緩存->數據庫;
  • insert,update,delete操作會清空所在namespace下的全部緩存;
  • 多表查詢一定不要使用二級緩存,因為多表操作進行更新操作,可能會產生臟數據。

總體來說,MyBatis的緩存功能比較雞肋。想要使用緩存的話還是建議使用spring-cache等框架。

參考

  • https://blog.csdn.net/zb313982521/article/details/79689169
  • https://mp.weixin.qq.com/s?__biz=MzI4NDY5Mjc1Mg==&mid=2247489120&idx=2&sn=4694c4a359849d17354f85206768c25b&chksm=ebf6ce1fdc81470918515ff76c41d7aea9434226ef05e930fec59ed22dcc709030a6683c0d80&mpshare=1&scene=1&srcid=&sharer_sharetime=1566873637232&sharer_shareid=2040c1b4c62e1f430c804ebd0fe79fa3#rd

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

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

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

銷量榜長期佔據第一,人氣哈弗H6應該選哪個配置?_貨運

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

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

58-12。38萬,價格相當實在,僅僅比起兩驅版本高8000元。但考慮哈弗H6城市SUV的定位,適時四驅的驅動形式,以及動力水平考慮,這套四驅在城市使用程度並不高,只會增加油耗,並不建議大家選擇四驅車型。(上圖分別為哈弗H6紅標版、藍標版)哈弗H6最大的亮點就是其空間表現了,4649*1852*1710mm的車身尺寸看着相當魁梧,而且有着2680mm的軸距,在這個價位中表現是非常出色的,滿足國人對車身尺寸以及空間的追求。

前言

要說中國的SUV神車是哪一輛的話,哈弗H6肯定可以牢牢霸佔這個地位,一直霸佔着中國SUV銷量第一的位置,在不斷有着競爭對手向起衝鋒的時候也可以守住地位,而且還依然領先第二名2萬輛。而這款神車有着超多的配置以及動力總成可以選擇,究竟這款中國神車應該選擇哪一個配置性價比才是最高呢?

(上圖分別為哈弗H6紅標版、藍標版)

哈弗H6有着兩種品牌標識,一個是沉穩的紅標版H6,另一個是標榜運動年輕的藍標版H6,藍標版H6要比紅標版官方指導價要高2000元,並且增加后視鏡電動摺疊功能,是否願意為藍標的外觀以及這電動后視鏡摺疊功能埋單就看自己的個人喜好了,在其他部分兩者幾乎是一模一樣。

哈弗H6有着兩種發動機總成選擇,分別是1.5T渦輪增壓汽油發動機以及2.0T柴油發動機,因為多數消費者均選擇汽油版本,本次對比僅僅針對1.5T發動機進行對比。而該發動機最大功率110千瓦,最大扭矩210牛米,表現只能說是一般,僅僅能滿足家庭需求。在日常駕駛中能夠感受明顯的渦輪遲滯現象,低扭表現一般,動力要到2500轉以上能有好轉,

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

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

所以要想有着暢快的駕駛感受就不應該吝嗇腳下的油門了。

作為一款SUV,哈弗H6除了一般的兩驅車型以外,還有着四驅車型選擇,價位為11.58-12.38萬,價格相當實在,僅僅比起兩驅版本高8000元。但考慮哈弗H6城市SUV的定位,適時四驅的驅動形式,以及動力水平考慮,這套四驅在城市使用程度並不高,只會增加油耗,並不建議大家選擇四驅車型。

(上圖分別為哈弗H6紅標版、藍標版)

哈弗H6最大的亮點就是其空間表現了,4649*1852*1710mm的車身尺寸看着相當魁梧,而且有着2680mm的軸距,在這個價位中表現是非常出色的,滿足國人對車身尺寸以及空間的追求。

(上圖分別為哈弗H6紅標版、藍標版)

內飾方面,哈弗H6選擇的是一種比較中庸的風格,紅標使用的是仿木材料作為裝飾,而藍標則是選擇了金屬色澤的裝飾條,更為年輕好看。雖然在視覺上並不能給人驚艷的感覺,但總歸耐看,而且在用料做工上都是該價位的優秀水平,所以不少用戶選購哈弗H6是因為這個內飾表現。

(上圖分別為哈弗H6紅標版、藍標版)

配置方面也是H6的亮點之一,2017款全系標配ESp車身穩定系統、4安全氣囊、胎壓監測系統、上坡輔助、電動天窗、多功能方向盤、定速巡航、倒車影像、倒車雷達、仿皮座椅、駕駛位座椅電動調節、前排座椅加熱、車載導航、自動空調以及發動機啟停功能,考慮到2017款10.78萬的起售價,哈弗H6即使是最低配也有非常高的實用性。

對於選擇手動擋的用戶,筆者最為推薦的比最低配高6000元的手動兩驅尊貴型,在配置上多了前後排頭部安全氣囊、前駐車雷達、自動大燈、后視鏡電動摺疊以及感應雨刷,在舒適性以及安全性都有着較大的提升,而且價格差距不大。

而對於選擇自動擋的用戶,性價比最高的則是自動尊享型,也僅僅是以6000元的價格獲得上述的配置提升。而藍標雖然比起紅標版多了氙氣大燈,但考慮到它2000元的差價性價比還是比較一般的,畢竟一個氙氣大燈成本並不高於1000元。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

這款起價只要6萬多的在9月份賣了兩萬多台的SUV車主愛她么_網頁設計公司_網頁設計公司

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

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

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

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

目前百公里油耗為8。5L左右,表現一般。車主一購買車型: 2017款 1。5L 手動豪華型裸車價格: 7。00萬滿意的地方:改款之後,尤其是換標之後,覺得比老款好看多了。作為一名手動擋的老司機,當時直接就選擇了1。5L手動擋最低配,但是發現最低配連ESp都沒有,覺得還是安全最重要就選擇了次低配。

瑞風S3的九月份銷量為21888輛,作為一款自主小型SUV,這樣的表現確實很不錯。同時也有很多朋友問到這款車,那麼我們就來看看那車主如何評價S3。

江淮汽車-瑞風S3

指導價:6.58-9.58萬

長寬高(新老款有所不同):

4345*1765*1615mm

4345*1765*1640mm

4325*1765*1660mm

軸距:2560mm

動力系統:

1.5L 113馬力/1.6L 120馬力+6擋手動/CVT

車主一

購買車型: 2017款 1.6L CVT豪華智能型

裸車價格: 8.78萬

滿意的地方:我屬於“外貌協會”的,雖然有人覺得S3不好看,但是我自己覺得好看就可以了。尺寸要比同級別的小型SUV大不少,同時車內空間也比較大,家人坐在後排不會感到擁擠,同時舒適性也不錯。 動力要比老款的1.5L好多了,雖然沒有推背感吧,但是家用還是足夠了,同時CVT很平順,幾乎感覺不到換擋。

但是前排側氣囊、前/後排頭部氣囊、天窗都要選裝,因為是新款的緣故,所以優惠比較少,性價比只能說是一般吧,不能說太高,

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

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

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

如果能優惠5000以上性價比就凸顯出來了。目前百公里油耗為8.5L左右,表現一般。

車主一

購買車型: 2017款 1.5L 手動豪華型

裸車價格: 7.00萬

滿意的地方:改款之後,尤其是換標之後,覺得比老款好看多了。作為一名手動擋的老司機,當時直接就選擇了1.5L手動擋最低配,但是發現最低配連ESp都沒有,覺得還是安全最重要就選擇了次低配。配置還算將就,肯定比合資車強多了。打算過段時間裝上仿皮座椅和中控屏,這樣看起來就明顯上檔次了,不過好在配備了日間行車燈。有人說動力不足,但是我覺得動力足夠了,只要選擇合適的擋位,用力踩油門就是了,動力肯定不能飈車,但是家用肯定足夠了。

油耗目前為7L多,表現很不錯,不過新車價格幾乎沒有優惠導致心裏很不爽。另外噪音也有點大。

編輯總結:由於新款的S3剛上市,優惠很少,所以並不建議現在就出手,在等段時間優惠肯定會多起來的。不過S3的價格也算比較實惠,配置還可以,質量也不錯,口碑很好,也是一款值得推薦的SUV。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

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

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

別猶豫了 15萬內合資SUV買他們准沒錯!_包裝設計

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

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

0L 161馬力+6擋手自一體。其中2。0L已經停產,但是還有少量車子再繼續售賣。KX3的1。6T車型動力表現很不錯,雖然雙離合變速箱還有一定的不足,但是比起市面上其它的雙離合,還是要強一點的。不過家用的話還是要回歸理性的,1。

想買SUV,自主的大空間緊湊型SUV看不上,但是合資的緊湊型SUV又覺得價格太貴,折中的選擇就是合資小型SUV,所以今天給大家推薦三款大空間的合資小型SUV,買這些車子准沒錯。

上汽通用別克-昂科拉

新款昂科拉的車身尺寸為4278*1781*1648mm,軸距為2555mm。老款的昂科拉處於停產在售狀態,就不做過多的介紹,因為在價格差不多的情況下當然是買最新款的車型。昂科拉屬於城市SUV,所以看起來很時尚,胖乎乎的造型使得昂科拉看起來比較可愛。

因為昂科拉看着比較厚實,所以即使車長沒有達到4.3米,但是看起來也不會顯得很小,內飾也是屬於比較時尚的類型,用料也很下本。

昂科拉的動力系統為1.4T 140馬力+6擋手動/6擋手自一體。全系都是1.4T發動機,這一點很不錯,如果是手動擋車型,那麼動力體驗會很好,爆發力很強,但是如果是自動檔的話,因為6AT不是特別的聰明,由於變速箱拖累了發動機,所以顯得車子動力不是那麼有力道,不過不吹毛求疵的話,1.4T+6擋手自一體,這樣的動力組合還是很夠用的。

昂科拉整車用料很厚道,1.4T自動擋車型百公里油耗為8.5L左右,表現中規中矩。

東風悅達起亞-起亞KX3

起亞KX3的車身尺寸為4270*1780*1630mm和4270*1780*1645,軸距為2590mm。尺寸幾乎和昂科拉一樣,但是由於造型原因,所以起亞KX3看起來並沒有那麼顯大。但是起亞KX3外觀確實是一個亮點,

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

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

很好看,尤其是雙色車身的KX3。畢竟,韓國出來的車子,大多數都是顏值挺高的。

KX3的動力系統為1.6L 125馬力+6擋手動/6擋手自一體,1.6T 160馬力+7擋雙離合,2.0L 161馬力+6擋手自一體。其中2.0L已經停產,但是還有少量車子再繼續售賣。KX3的1.6T車型動力表現很不錯,雖然雙離合變速箱還有一定的不足,但是比起市面上其它的雙離合,還是要強一點的。

不過家用的話還是要回歸理性的,1.6L車型足夠家用,不過油耗表現不是很好。我們曾經實測的數據,1.6L手動擋的百公里油耗為8L左右,自動擋為9L左右。和昂科拉一樣,KX3也有着一兩萬多的優惠,性價比還是不錯的。

廣汽本田-繽智

繽智的車身尺寸是4294*1772*1605mm,軸距是2610mm。繽智也是小型SUV,尺寸和它們兩個差不多,但是因為繽智是本田的,所以它的車內空間卻比它們好了一個檔次,繽智的外觀也是很靚麗,可以滿足絕大多數人的審美要求。

繽智的動力系統為1.5L 131馬力+6擋手動/CVT,1.8L 136馬力+6擋手動/CVT,繽智是一個性格鮮明的选手,空間很大,動力系統非常平順,1.5L和1.8L發動機都比較有力,但是油耗卻比較低,1.5L自動擋的百公里油耗不到7L,1.8L自動擋的百公里油耗不到8L,表現很好。不過缺點就是噪音大、隔音差,底盤單薄,車漆薄,優惠太少等。最後小編吐槽一句,想買繽智了但是覺得繽智太貴了,那麼可以看一下飛度,也挺不錯的。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

MagSafe 會干擾心律調節器?蘋果支援頁面有正式解答了_貨運

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

再創新自家磁吸技術成為 iPhone 12 各式配件核心的 MagSafe,先前有媒體轉載醫學研究,指出可能會導致醫療器材的運作問題。現在,蘋果也為此釋出了官方的相關支援文件進行解答。甚至提到,如果「懷疑 iPhone 會干擾您的醫療裝置,請停止使用 iPhone。」繼續閱讀 MagSafe 會干擾心律調節器?蘋果支援頁面有正式解答了報導內文。

▲圖片來源:Apple

MagSafe 會干擾心律調節器?蘋果支援頁面有正式解答了

針對新世代 iPhone 12 系列開始搭載的 MagSafe 配件內的磁鐵,可能造成干擾醫療裝置如心律調節器和除顫器的狀況。Apple 最近更新了相關的支援文件,說明 MagSafe 因為內含會發射電磁場的組件與無線電功能,的確有可能產生干擾醫療器材的問題。但指出這方面的干擾風險「應該不會高於舊款 iPhone 機型。」

儘管如此,在此文件中 Apple 還是表示因醫療裝置的種類眾多,所以如果對此有疑慮,建議可以諮詢醫師或裝置製造商,確認是否需要保持兩者間的安全距離。

單就心律調節器和除顫器的部分,Apple 則是建議在這些裝置與 iPhone 及 MagSafe 配件,保持超過 15 公分的距離(MagSafe 無線充電配件,則是建議要 30 公分以上)。但還是建議有疑慮的話,請與專業醫療人員諮詢這方面的建議。甚至在文件的最後提到「如果您懷疑 iPhone 會干擾您的醫療裝置,請停止使用 iPhone。」

雖說就官方資訊,iPhone 12 系列相對其他 iPhone 並沒有高太多的干擾風險。但畢竟是與健康有直接相關的裝置,如果真的有在使用的話建議大家還是要多多小心注意。

事實上,有不少國家的大眾運輸工具會直接針對博愛座宣導周遭勿使用手機,所以這方面的風險不僅是在 iPhone 有而已,即便使用的是非 iPhone 產品。這次的新聞也希望提醒大家,假若周遭有親友使用類似的醫療器材,建議可以趁此詢問或注意一下相關使用須知,及時預防疏忽所帶來的可能風險。

引用來源

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

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

延伸閱讀:

曲面感光元件版 RX1 會是 Sony Alpha 發表會的重磅新品?

不只潮更厲害!AirPods Max 開箱使用體驗

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

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

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

小米 Redmi 系列首款支援雙 5G 的 Redmi Note 9T 5G 以及 6000mAh 大電量 Redmi 9T 在台推出(同場加映:小米10T Pro 將於1月29日開放預購)_網頁設計公司

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

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

今年初,小米才剛在海外舉行發表會推出中階的 Redmi Note 9T 5G 和 6000mAh 大電量的 Redmi 9T 入門手機,很快也在今(25)日稍早宣布將在台灣開賣囉! Redmi Not 9T 5G 搭載聯發科天璣 800U 5G 處理器,也是 Redmi 系列首款支援 5G+5G 雙卡雙待的 5G 手機,價位只要 NT$6,699 起。至於追求更大電量、更持久的用戶,這次也迎來入門的 Redmi 9T 作為重度使用者的新選擇。

小米 Redmi 系列首款支援雙 5G 的 Redmi Note 9T 5G 以及 6000mAh 大電量 Redmi 9T 在台推出

Redmi Note 9T 5G

Redmi Note 9T 5G 搭載八核心聯發科天璣 800U 處理器,支援 5G+5G 雙卡雙待,也是 Redmi Note 系列首款支援雙 5G 的機型。另外, Redmi Note 9T 5G 配備最高 4GB RAM 和 128GB ROM ,內建 5000mAh 大電量電池並支持 18W 快速充電,充電器和日前開賣的 POCO M3 一樣附贈 22.5W 快速充電器。
相機部份, Redmi Note 9T 5G 配備 4800 萬像素 AI 三鏡頭主相機,採用 4800 萬像素廣角鏡頭、 200 萬像素微距鏡頭和 200 萬像素景深鏡頭的組合,前置相機則配備 1300 萬像素自拍鏡頭。
螢幕方面, Redmi Note 9T 採用 6.53 吋 FHD+ 解析度打孔全螢幕,螢幕除通過德國萊茵 TÜV Rheinland 低藍光認證,表面覆蓋康寧第五代大猩猩保護。

其他應用方面, Redmi Note 9T 支援 NFC 、紅外線、立體聲雙揚聲器且保留 3.5mm 耳機插孔。在生物辨識方面,除了支援 AI 人臉解鎖也配備側面指紋感應器。
Redmi Note 9T 提供晨曦紫、日暮黑兩色選擇, 4GB+64GB 版本建議售價 NT$6,699 ,於2月1日起於中華電信、遠傳電信、亞太電信、小米專賣店、PChome24h購物小米旗艦館、燦坤3C、senaonline神腦生活、法雅客網路商店與friDay購物陸續上市;4GB+128GB 版本建議售價 NT$$7,499 ,於2月1日起於中華電信、遠傳電信、台灣之星、小米專賣店、PChome24h購物小米旗艦館、燦坤3C、senaonline神腦生活、法雅客網路商店與friDay購物陸續上市。

Redmi 9T

小米也針對入門手機市場帶來 Redmi 9T ,而它其實有許多規格和最近剛在台開賣掀起搶購熱潮的 POCO M3 十分相近,採用相同的處理器、螢幕尺寸、電池容量、機身重量也相同,最大差異除了品牌、外觀設計,還有主相機的鏡頭配置。
Redmi 9T 搭載 Qualcomm Snapdragon 662 處理器、6.53 吋 FHD+ 解析度水滴螢幕(擁有 L1 Widevine、德國萊茵 TÜV Rheinland低藍光認證)、6000mAh 大電量電池,不過 Redmi 9T 提供最高 6GB RAM 搭配 128GB ROM 的選擇。
相機部份, Redmi 9T 配備 4800 萬像素 AI 四鏡頭主相機,採用 4800 萬像素主鏡頭、 200 萬像素微距鏡頭、 200 萬像素景深鏡頭並加入 800 萬像素 120° 超廣角鏡頭搭配,前相機則一樣為 800 萬像素自拍鏡頭。

Redmi 9T 在電量部分採用 6000mAh 高充電循環電池,可待機 28 天、連續播放音樂 195 小時、通話時間 56 小時、影片播放 17 小時,並支援 18W 快速充電(附贈 22.5W 快速充電器)。在快速和高效率的處理下,機身也能保持低耗電量且不易過熱,且高循環週期電池更持久耐用。
其他方面, Redmi 9T 搭載立體聲雙揚聲器也同樣保留 3.5mm 耳機插孔,也支援 AI 人臉解鎖和側面指紋感應器。

Redmi 9T(4GB+64GB)提供碳纖灰、暮光藍、日出橙和海洋綠四種顏色,售價為 NT$4,699元;Redmi 9T(6GB+128GB)提供暮光藍、日出橙和海洋綠三種顏色,售價為 NT$5,499 ,將於二月中旬於小米專賣店、PChome24h購物小米旗艦館、燦坤3C及法雅客網路商店陸續開賣。

小米10T Pro

2020 年底,小米台灣預告在今年 1 月底會在台灣開放預購的小米 10T Pro ,現在也確定了預購和發售資訊。小米 10T Pro 搭載 Qualcomm Snapdragon 865 旗艦級 5G 處理器、配備 6.67 吋螢幕、8GB RAM、 256GB ROM ,相機配備 1 億像素 AI 三鏡頭,更擁有 5000mAh 超大電量及 33W 快速充電,更多關於小米10T 和小米10T Pro 的規格差異可參考我們之前的報導(點我前往)。

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

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

小米10T Pro 提供宇宙黑與極光藍共兩種顏色,售價為 NT$15,999,更享 2 年超長原廠保固。將於 1 月 29 日在小米專賣店、PChome24h購物小米旗艦館、燦坤3C、senaonline神腦生活與friDay購物開放預購,並於 2 月 5 日起正式於中華電信、遠傳電信、小米專賣店、PChome24h購物小米旗艦館、燦坤3C、senaonline神腦生活、法雅客網路商店與friDay購物陸續開賣(各通路開賣日期謹依實際到貨訊息為準,請洽詢各通路)。

圖片/消息來源:小米台灣

延伸閱讀:
POCO M3 開箱、評測|6000mAh 大電量超乎想像,極致性價比王者重返台灣市場

小米摺疊螢幕手機工程機曝光!再次於地鐵車廂被捕獲,只是螢幕摺痕有點顯眼

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

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

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。