主頁 > 軟體設計 > PCA(主成分分析法)原理以及應用+代碼實作

PCA(主成分分析法)原理以及應用+代碼實作

2021-03-06 10:54:42 軟體設計


前言

PCA多用于對資料特征集進行降維,也方便對資料集進行可視化操作,說白了最后進行結果展示那么多特征向量要一起表示的話肯定很難展示,超過三維的資料就很難展示了,而PCA可對特征集進行簡化,通俗的來講也就是合并好理解,PCA應用的范圍很廣因此很有必要要學習,原理肯定還是數學證明,在特征工程上經常使用,希望讀者看完能夠提出錯誤或者看法,博主會長期維護博客做及時更新,純分享,希望大家喜歡,

強烈推薦大家看看這篇Python機器學習筆記:主成分分析(PCA)演算法,寫的很詳細很好,

一、為什么需要PCA?(為什么要降維)

在各個領域進行資料收集或是資料采樣時往往都是存在多個指標或是特征用來表示某一現象或是用來作評估好壞,但是龐大的資料量難以展示,對多維資料分析的難度很大,更重要的是在多數情況下,許多變數之間可能存在相關性,從而增加了問題分析的復雜性,同時對分析帶來不便,如果分別對每個指標進行分析,分析往往是孤立的,而不是綜合的,盲目減少指標會損失很多資訊,容易產生錯誤的結論,

我們常常用二維模型來進行結果展示,通常進行展示的資料都是二維資料,但是想象一下對于四維以及四維以上的資料我們該如何進行展示?

例如我們要對地鐵擁堵情況進行評估和展示,對于評估地鐵擁堵情況,我們將采用

日期天氣情況濕度風級降水量體感溫度節假日波動系數突發事件客流量


這九個指標進行預測地鐵擁堵情況,我們通常在一張坐標軸上進行效果展示從而進行分析,但在對這些多維資料進行展示的話我們尋常的展示效果圖肯定展示不出來,資料往往擁有超出顯示能力的更多特征,資料顯示并非大規模特征下的唯一難題,對資料進行簡化還有如下一系列的原因:

  • 使得資料集更容易使用;
  • 降低很多演算法的計算開銷;
  • 去除噪聲;
  • 使得結果容易理解;

在已標注與未標注的資料上都有降維技術,這里我們將主要關注未標注資料上的降維技術,該技術同時也可以應用于已標注的資料,

而在資料特征工程降維技術中,PCA的應用目前最為廣泛,

二、PCA簡介

主成分分析法(PCA)是設法將原來變數重新組合成一組新的相互無關的幾個綜合變數,同時根據實際需要從中可以取出幾個較少的總和變數盡可能多地反映原來變數的資訊的統計方法叫做主成分分析或稱主分量分析,也是數學上處理降維的一種方法,主成分分析是設法將原來眾多具有一定相關性(比如P個指標),重新組合成一組新的互相無關的綜合指標來代替原來的指標,通常數學上的處理就是將原來P個指標作線性組合,作為新的綜合指標,

在數學上更簡單的理解我們可以把它想象為對很多個坐標點通過映射方法到一根函式直線上,通過這種方法我們肯定會得到新的特征用來表示這個事件,新的特征剔除了原有特征的冗余資訊,因此更有區分度,新的特征基于原有特征,它能夠重建原有特征,主成分分析要保留最有可能重建原有特征的新特征,從而達到資料降維的作用,

例如我們得到了一個二維資料集,里面一個標簽僅僅只用兩個(x1,x2)特征就能表示,但是我們只能用一個特征去描述這件事,在原始的x1,x2坐標軸上,我們無論刪掉x1或者是x2我們都不能完整的表達出這個點來,但是我們可以通過PCA,將資料從原來的坐標系轉換到了新的坐標系,新坐標系的選擇是由資料本身決定的,第一個新坐標軸選擇的是原始資料中方差最大的方向,第二個新坐標軸的選擇和第一個坐標軸正交且具有最大方差的方向,該程序一直重復,重復次數為原始資料中特征的數目,就通過該資料集(x1,x2),我們通過該方法構建出(y1,y2)坐標系,在該坐標系中我們可以發現資料基本都集中在y1軸上面,而y2這條短軸上則差距很小,在極端的情況,短軸如果退化成一點,那只有在長軸的方向才能夠解釋這些點的變化了;這樣,由二維到一維的降維就自然完成了,

三、PCA演算法推導

要詳細了解PCA演算法原理還是需要一定的數學基礎的,不是那么容易理解推匯出來的,但是可以盡可能的簡化推導程序,但是還是有必須清楚掌握的數學知識,

1.投影

首先我們知道在笛卡爾直角坐標系中上面的點都可以用一個二維向量表示,當然如果是n維向量可以等價表示為n維空間中的一條從原點發射的有向線段,只不過就是很那表示,假設我們就在二維笛卡爾直角坐標系中,有

A(x1,y1),B(x2,y2),那么在二維平面上A和B可以用兩條發自原點的有向線段表示,如下圖:

我們知道垂線與B的交點叫做A在B上的投影,再假設A與B的夾角為a,則投影的矢量長度為(這里假設向量B的模為1)|A|cos(a).

|A|就是A點的模,也就是A線段的標量長度,

而且我們知道:A\cdot B=|A||B|cos(a)

如果B向量的模為1的話,我們就可以發現得到A\cdot B=|A|cos(a).

2.基

一個二維向量可以對應二維笛卡爾直角坐標系中從原點出發的一條有向線段,對于(x1,x2)來說,那么他們對應的坐標軸就是:

我們假設有一點(3,2),而它對應的向量就為從原點到(3,2)的有向線段,而我們知道該向量在軸上的投影值3,在y軸上的投影值為2,我們設該點為A

x軸上:x\cdot A=|A||x|cos(a),而在x軸上我們可以設它的模為1,x可為(1,0).

y軸上:y\cdot A=|A||y|cos(a),而在y軸上我們可以設它的模為1,y可為(1,0).

經過簡單的數學變換,向量(x1,x2)實際上表示線性組合:

不難證明所有二維向量都可以表示為這樣的線性組合,此處(1,0)(0,1)叫做二維空間的一組基,

所以,要準確描述向量,首先要確定一組基,然后給出基所在的各個直線上的投影值,就可以了,只不過我們經常省略第一步,而默認以(1,0)(0,1)為基,

當然我們也可以以其他向量為基底,(1,1)(1,1)(1,-1)也可以成為一組基,

一般來說,我們希望基的模是1,因為從內積的意義可以看到,如果基的模式1,那么就可以方便的用向量點乘基而直接獲得其在新基上的坐標了!實際上,對應于任何一個向量我們總可以找到其同方向上模為1的向量,只要讓兩個分量分別除以模就好了,例如上面的基就可以變為:(1/\sqrt{2},1/\sqrt{2}),(1/\sqrt{2},-1/\sqrt{2})

現在我們想獲得(3,2)在新基上的坐標,即在兩個方向上的投影矢量值,那么根據內積的幾何意義,我們只要分別計算(3,2)和兩個基的內積,不難得到新的坐標為((5/ \sqrt{2}, -1/\sqrt{2} ) ),

3.基變換的矩陣表示

(3,2)變換為新基上的坐標,就是用(3,2)與第一個基做內積運算,作為第一個新的坐標分量,然后用(3,2)與第二個基做內積運算,作為第二個新坐標的分量,實際上,我們可以用矩陣想成的形式簡潔的表示這個變換:

那么對于多個二維向量,例如(1,1),(2,2),(3,3)想變換到剛才那組基上,則可以變為這樣:

一般地,如果我們有M個N維向量,想將其變換為由R個N維向量表示的新空間中,那么首先將R個基按照行組成矩陣A,,然后將向量按照列組成矩陣B,那么兩個矩陣的乘積AB就是變換結果,其中AB的第m列為A中的第M列變換后的結果,

  數學表示為:

特別要注意的是,這里R可以小于N,而R決定了變換后資料的維數,也就是說,我們可以將一個N維資料變換到更低維度的空間中去,變換后的維度取決于基的數量,因此這種矩陣相乘的表示也可以表示為降維變換,

4.方差

現在我們知道可以通過將原始矩陣(特征集)通過投影的方式映射到不同的基底上從而構建新的特征,經過變換后達到降維的目的,而現在我們要知道如何選擇正確的基底來幫助我們降維,

我們知道要使得向量經過投影之后更具有區分性,經過投影后要盡可能的分散,而這種分散程度,可以用數學上的方差來表述,

此處,一個欄位的方差可以看做事每個元素與欄位均值的差的平方和的均值,即:

但如果每一次計算方差都要減去一個欄位均值顯然更加累贅,我們可以通過對資料的預處理使得欄位的均值為0,例如我們的資料由五條記錄組成,將它們表示為矩陣形式:

我們通過減去均值得到:

這樣的話\mu就為0了,因此方差可以直接用每個元素的平方和除以元素個數表示:

于是上面的問題被形式化表示為:尋找一個一維基,使得所有資料變換為這個基上的坐標表示后,方差值最大,

5.協方差

上述方法只能解決二維到一維的降維,但是對于多維資料我們第一步選擇方差最大化的降第一維方式,那么我們第二步該如何選擇呢?

如果我們還是單純的只選擇方差最大的方向,很顯然,這個方向與第一個方向應該是“幾乎重合在一起”,顯然這樣的維度是沒有用的,因此應該有其他約束條件,

數學上可以用兩個欄位的協方差表示其相關性

  • 是一種用來度量兩個隨機變數關系的統計量,
  • 只能處理二維問題,
  • 計算協方差需要計算均值,

由于已經讓每個欄位均值為0,則:

可以看出,在欄位均值為0的情況下,兩個欄位的協方差簡潔的表示為其內積除以元素數m,協方差的絕對值越大,則二個變數相互影響越大,

當協方差為0時,表示兩個欄位完全獨立,為了讓協方差為0,我們選擇第二個即時只能在與第一個基正交的方向上選擇,因此最終選擇的兩個方向一定是正交的,

  至此,我們得到了降維問題的優化目標:將一組N維向量降維k維(K大于0,小于N),其目標是選擇K個單位(模為1)正交基,使得原始資料變換到這組基上后,各欄位兩兩間協方差為0,而欄位的方差則盡可能大(在正交的約束下,取最大的k個方差),

然后我們用X乘以X的轉置,并乘上系數1/m:

這時候我們會發現,這個矩陣對角線上的兩個元素分別是兩個欄位的方差,而其他元素是a和b的協方差,兩者被統一到了一個矩陣的,

根據矩陣相乘的運演算法則,這個結論很容易被推廣到一般情況:

設我們有m個n維資料記錄,將其按列排成n乘m的矩陣X,設C= 1/m*X*XT,則C是一個對稱矩陣,其對角線分別是各個欄位的方差,而第l行j列和j行i列元素相同,表示i和j兩個欄位的協方差,

6.協方差矩陣

 假設我們只有a和b 兩個欄位,那么我們將他們按行組成矩陣X:

  • 協方差矩陣能處理多維問題;
  • 協方差矩陣是一個對稱的矩陣,而且對角線是各個維度上的方差,
  • 協方差矩陣計算的是不同維度之間的協方差,而不是不同樣本之間的,
  • 樣本矩陣中若每行是一個樣本,則每列為一個維度,所以計算協方差時要按列計算均值,

如果資料是3維,那么協方差矩陣是:

7.特征值與特征向量

對于Ax=\lambda x也可以寫作:

8.協方差矩陣對角化

設原始資料矩陣X對于的協方差矩陣為C,而P是一組基按行組成的矩陣,設Y=PX,則Y為X對P做基變換后的資料,設Y的協方差矩陣為D,我們推導一下D與C的關系:

其實到這里快差不多了,優化目標變成了尋找一個矩陣P,滿足PCPT是一個對角矩陣,并且對角元素按照從大到小依次排列,那么P的前K行就是要尋找的基,用P的前K行就是要尋找的基,用P的前K行組成的矩陣乘以X就使得X從N維降到了K維并滿足上述優化條件,

協方差矩陣C是一個對稱矩陣,在線性代數上,實對稱矩陣有一系列非常好的性質:

  1. 實對稱矩陣不同特征值對應的特征向量必然正交,
  2. 設特征向量 λ 重數為r,則必然存在r個線性無關的特征向量對應于 λ,因此可以將這r個特征向量單位正交化,

一個n行n列的實對稱矩陣一定可以找到n個單位正交特征向量,設這n個特征向量為e1, e2, ...en,我們將其按照列組成矩陣:

 則對協方差矩陣C有如下結論:

其中 Λ 為對稱矩陣,其對角元素為各特征向量對應的特征值(可能有重復),

到這里,我們發現我們已經找到了需要的矩陣P:

P是協方差矩陣的特征向量單位化后按照行排列出的矩陣,其中每一行都是C的一個特征向量,如果設P按照 Λ 中特征值從大到小,將特征向量從上到下排列,則用P的前K行組成的矩陣乘以原始資料矩陣X,就可以得到我們需要的降維后的資料矩陣Y,

至此,我們完成了整個PCA的數學原理討論,

四、PCA運用流程

  • 1) 將原始資料按列組成n行m列矩陣X
  • 2)將X的每一行(代表一個屬性欄位)進行零均值化(去平均值),即減去這一行的均值
  • 3)求出協方差矩陣 C= 1/m*X*XT
  • 4)求出協方差矩陣的特征值及對應的特征向量
  • 5)將特征向量按對應特征值大小從上到下按行排列成矩陣,取前k行組成矩陣P(保留最大的k各特征向量)
  • 6)Y=PX 即為降維到K維后的資料

將資料轉換成前N個主成分的偽代碼大致如下:

去除平均值
計算協方差矩陣
計算協方差矩陣的特征值和特征向量
將特征值從大到小排序
保留最上面的N個特征向量
將資料轉換到上述N個特征向量構建的新空間中
from numpy import *
 
 
#從一個文本檔案中讀入一個資料集,資料集示例如下:
'''
8.805945	10.575145
9.584316	9.614076
11.269714	11.717254
9.120444	9.019774
7.977520	8.313923
'''
 
def loadDataSet(fileName, delim='\t'):
    fr = open(fileName)
    stringArr = [line.strip().split(delim) for line in fr.readlines()]
    datArr = [map(float,line) for line in stringArr]
    return mat(datArr)
 
	
#基于numpy實作pca演算法	
def pca(dataMat, topNfeat=9999999):                           #原資料  m*n
    meanVals = mean(dataMat, axis=0)                          #均值:1*n
    meanRemoved = dataMat - meanVals 			              #去除均值  m*n
    covMat = cov(meanRemoved, rowvar=0)                       #協方差矩陣 n*n
    eigVals,eigVects = linalg.eig(mat(covMat))				  #特征矩陣  n*n
    eigValInd = argsort(eigVals)            #將特征值排序
    eigValInd = eigValInd[:-(topNfeat+1):-1]  #僅保留p個列(將topNfeat理解為p即可)   
    redEigVects = eigVects[:,eigValInd]       # 僅保留p個最大特征值對應的特征向量,按從大到小的順序重組特征矩陣n*p
    lowDDataMat = meanRemoved * redEigVects		#將資料轉換到低維空間lowDDataMat: m*p
    reconMat = (lowDDataMat * redEigVects.T) + meanVals    #從壓縮空間重構原資料reconMat:  m*n
    return lowDDataMat, reconMat


參閱:

Python機器學習筆記:主成分分析(PCA)演算法

https://baike.baidu.com/item/%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90/829840?fromtitle=%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90%E6%B3%95&fromid=2652206&fr=aladdin

PCA原理

均值,方差,協方差,協方差矩陣,特征值,特征向量

https://blog.csdn.net/wiborgite/article/details/83513234

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/266708.html

標籤:其他

上一篇:現在的年輕人怎么了?才20幾歲就在焦慮35歲后的出路!說程式員是青春飯的都是因為自己菜!

下一篇:烤面筋的第十一場

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more