Python 機器學習 基礎 之 數據表示與特征工程 【分類變量】的簡單說明

Python 機器學習 基礎 之 數據表示與特征工程 【分類變量】的簡單說明

目錄

Python 機器學習 基礎 之 數據表示與特征工程 【分類變量】的簡單說明

一、簡單介紹

二、數據表示與特征工程

數據表示

特征工程

三、分類變量

1、One-Hot編碼(虛擬變量)

附錄

一、參考文獻


一、簡單介紹

Python是一種跨平臺的計算機程序設計語言。是一種面向對象的動態類型語言,最初被設計用于編寫自動化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越多被用于獨立的、大型項目的開發。Python是一種解釋型腳本語言,可以應用于以下領域: Web 和 Internet開發、科學計算和統計、人工智能、教育、桌面界面開發、軟件開發、后端開發、網絡爬蟲。

Python 機器學習是利用 Python 編程語言中的各種工具和庫來實現機器學習算法和技術的過程。Python 是一種功能強大且易于學習和使用的編程語言,因此成為了機器學習領域的首選語言之一。Python 提供了豐富的機器學習庫,如Scikit-learn、TensorFlow、Keras、PyTorch等,這些庫包含了許多常用的機器學習算法和深度學習框架,使得開發者能夠快速實現、測試和部署各種機器學習模型。

Python 機器學習涵蓋了許多任務和技術,包括但不限于:

  1. 監督學習:包括分類、回歸等任務。
  2. 無監督學習:如聚類、降維等。
  3. 半監督學習:結合了有監督和無監督學習的技術。
  4. 強化學習:通過與環境的交互學習來優化決策策略。
  5. 深度學習:利用深度神經網絡進行學習和預測。

通過 Python 進行機器學習,開發者可以利用其豐富的工具和庫來處理數據、構建模型、評估模型性能,并將模型部署到實際應用中。Python 的易用性和龐大的社區支持使得機器學習在各個領域都得到了廣泛的應用和發展。

二、數據表示與特征工程

之前我們一直假設數據是由浮點數組成的二維數組,其中每一列是描述數據點的 連續特征 (continuous feature)。對于許多應用而言,數據的收集方式并不是這樣。一種特別常見的特征類型就是分類特征 (categorical feature),也叫離散特征 (discrete feature)。這種特征通常并不是數值。分類特征與連續特征之間的區別類似于分類和回歸之間的區別,只是前者在輸入端而不是輸出端。我們已經見過的連續特征的例子包括像素明暗程度和花的尺寸測量。分類特征的例子包括產品的品牌、產品的顏色或產品的銷售部門(圖書、服裝、硬件)。這些都是描述一件產品的屬性,但它們不以連續的方式變化。一件產品要么屬于服裝部門,要么屬于圖書部門。在圖書和服裝之間沒有中間部門,不同的分類之間也沒有順序(圖書不大于服裝也不小于服裝,硬件不在圖書和服裝之間,等等)。

無論你的數據包含哪種類型的特征,數據表示方式都會對機器學習模型的性能產生巨大影響。我們在之前案例可以中看到,數據縮放非常重要。換句話說,如果你沒有縮放數據(比如,縮放到單位方差),那么你用厘米還是英寸表示測量數據的結果將會不同。我們在之前的案例中還看到,用額外的特征擴充 (augment)數據也很有幫助,比如添加特征的交互項(乘積)或更一般的多項式。

對于某個特定應用來說,如何找到最佳數據表示,這個問題被稱為特征工程 (feature engineering),它是數據科學家和機器學習從業者在嘗試解決現實世界問題時的主要任務之一。用正確的方式表示數據,對監督模型性能的影響比所選擇的精確參數還要大。

機器學習中的數據表示與特征工程是模型訓練的基礎環節。

  • 數據表示指的是如何將原始數據轉換為機器學習算法可以處理的形式。
  • 特征工程是指從原始數據中提取或創建特征,以便更好地進行模型訓練。

以下是關于數據表示和特征工程的詳細介紹:

數據表示

  1. 數值數據: 最常見的數據類型,可以直接用于大多數機器學習算法。包括整數和浮點數。

    • 示例:年齡、收入、評分等。
  2. 分類數據: 包含離散的類別或標簽,需要轉換為數值形式才能用于算法中。

    • 標簽編碼(Label Encoding): 將每個類別映射為一個整數。
    • 獨熱編碼(One-Hot Encoding): 使用二進制向量表示每個類別。
    • 示例:性別(男、女)、城市(紐約、倫敦、巴黎)等。
  3. 文本數據: 需要轉換為數值表示,常用方法有:

    • 詞袋模型(Bag of Words): 統計每個單詞在文本中出現的次數。
    • TF-IDF(Term Frequency-Inverse Document Frequency): 考慮單詞在文檔和整個語料庫中的頻率。
    • 詞向量(Word Embeddings): 使用預訓練的詞向量模型(如Word2Vec、GloVe)將單詞表示為向量。
  4. 時間序列數據: 包含時間戳和相應的值。常用的方法有:

    • 時間特征提取: 提取如年、月、日、小時、星期幾等特征。
    • 滑動窗口: 創建時間窗口來捕捉短期趨勢。
    • 差分處理: 計算當前值與前一個值的差異。

特征工程

  1. 特征選擇: 從原始數據中選擇對預測任務最有用的特征。

    • 過濾法(Filter Method): 基于統計特性選擇特征,如方差選擇、互信息選擇等。
    • 包裹法(Wrapper Method): 使用特定的機器學習模型選擇特征,如遞歸特征消除(RFE)。
    • 嵌入法(Embedded Method): 在模型訓練過程中選擇特征,如LASSO回歸中的L1正則化。
  2. 特征提取: 從原始數據中提取新的特征。

    • 主成分分析(PCA): 降維技術,通過線性變換將數據映射到新的特征空間。
    • 獨立成分分析(ICA): 類似于PCA,但假設特征是獨立的。
    • 特征聚合: 將多個特征組合在一起,如求和、平均等。
  3. 特征構造: 基于現有特征創建新的特征。

    • 多項式特征: 創建特征的多項式組合,如𝑥12,𝑥1𝑥2x12?,x1?x2?等。
    • 交互特征: 計算兩個或多個特征的交互作用,如乘積、比值等。
  4. 特征縮放: 將特征值縮放到相同范圍,以提高模型的穩定性和收斂速度。

    • 標準化(Standardization): 將特征縮放到均值為0,方差為1的分布。
    • 歸一化(Normalization): 將特征縮放到指定范圍(通常是0到1)。

三、分類變量

作為例子,我們將使用美國成年人收入的數據集,該數據集是從 1994 年的普查數據庫中導出的。adult 數據集的任務是預測一名工人的收入是高于 50 000 美元還是低于 50 000 美元。這個數據集的特征包括工人的年齡、雇用方式(獨立經營、私營企業員工、政府職員等)、教育水平、性別、每周工作時長、職業,等等。表 4-1 給出了該數據集中的前幾個條目。

表4-1:adult 數據集的前幾個條目
 ageworkclasseducationgenderhours-per-weekoccupationincome
039State-govBachelorsMale40Adm-clerical<=50K
150Self-emp-not-incBachelorsMale13Exec-managerial<=50K
238PrivateHS-gradMale40Handlers-cleaners<=50K
353Private11thMale40Handlers-cleaners<=50K
428PrivateBachelorsFemale40Prof-specialty<=50K
537PrivateMastersFemale40Exec-managerial<=50K
649Private9thFemale16Other-service<=50K
752Self-emp-not-incHS-gradMale45Exec-managerial>50K
831PrivateMastersFemale50Prof-specialty>50K
942PrivateBachelorsMale40Exec-managerial>50K
1037PrivateSome-collegeMale80Exec-managerial>50K

這個任務屬于分類任務,兩個類別是收入 <=50k>50k 。也可以預測具體收入,那樣就變成了一個回歸任務。但那樣問題將變得更加困難,而理解 50K 的分界線本身也很有趣。

在這個數據集中,age (年齡)和 hours-per-week (每周工作時長)是連續特征,我們知道如何處理這種特征。但 workclass (工作類型)、education (教育程度)、gender (性別)、occupation (職業)都是分類特征。它們都來自一系列固定的可能取值(而不是一個范圍),表示的是定性屬性(而不是數量)。

首先,假設我們想要在這個數據上學習一個 Logistic 回歸分類器。我們在第 2 章學過,Logistic 回歸利用下列公式進行預測,預測值為 \hat{y}

其中?w?[i?] 和?b?是從訓練集中學到的系數,x?[i?] 是輸入特征。當?x?[i?] 是數字時這個公式才有意義,但如果?x?[2] 是?"Masters"?或?"Bachelors"?的話,這個公式則沒有意義。顯然,在應用 Logistic 回歸時,我們需要換一種方式來表示數據。下一節將會說明我們如何解決這一問題。

1、One-Hot編碼(虛擬變量)

到目前為止,表示分類變量最常用的方法就是使用 one-hot 編碼 (one-hot-encoding)或 N 取一編碼 (one-out-of-N encoding),也叫虛擬變量 (dummy variable)。虛擬變量背后的思想是將一個分類變量替換為一個或多個新特征,新特征取值為 0 和 1。對于線性二分類(以及 scikit-learn 中其他所有模型)的公式而言,0 和 1 這兩個值是有意義的,我們可以像這樣對每個類別引入一個新特征,從而表示任意數量的類別。

比如說,workclass 特征的可能取值包括 "Government Employee""Private Employee""Self Employed""Self Employed Incorporated" 。為了編碼這 4 個可能的取值,我們創建了 4 個新特征,分別叫作 "Government Employee""Private Employee""Self Employed""Self Employed Incorporated" 。如果一個人的 workclass 取某個值,那么對應的特征取值為 1,其他特征均取值為 0。因此,對每個數據點來說,4 個新特征中只有一個的取值為 1。這就是它叫作 one-hot 編碼或 N 取一編碼的原因。

其原理如表 4-2 所示。利用 4 個新特征對一個特征進行編碼。在機器學習算法中使用此數據時,我們將會刪除原始的 workclass 特征,僅保留 0-1 特征。

表4-2:利用one-hot編碼來編碼workclass 特征
workclassGovernment EmployeePrivate EmployeeSelf EmployedSelf Employed Incorporated
Government Employee1000
Private Employee0100
Self Employed0010
Self Employed Incorporated0001

我們使用的 one-hot 編碼與統計學中使用的虛擬編碼(dummy encoding)非常相似,但并不完全相同。為簡單起見,我們將每個類別編碼為不同的二元特征。在統計學中,通常將具有?k?個可能取值的分類特征編碼為?k?- 1 個特征(都等于零表示最后一個可能取值)。這么做是為了簡化分析(更專業的說法是,這可以避免使數據矩陣秩虧)。

將數據轉換為分類變量的 one-hot 編碼有兩種方法:一種是使用 pandas ,一種是使用 scikit-learn 。在寫作本書時,使用 pandas 要稍微簡單一些,所以我們選擇這種方法。首先,我們使用 pandas 從逗號分隔值(CSV)文件中加載數據:

import pandas as pd
from IPython.display import display# 文件中沒有包含列名稱的表頭,因此我們傳入header=None
# 然后在"names"中顯式地提供列名稱
data = pd.read_csv("data/adult.data", header=None, index_col=False,names=['age', 'workclass', 'fnlwgt', 'education',  'education-num','marital-status', 'occupation', 'relationship', 'race', 'gender','capital-gain', 'capital-loss', 'hours-per-week', 'native-country','income'])
# 為了便于說明,我們只選了其中幾列
data = data[['age', 'workclass', 'education', 'gender', 'hours-per-week','occupation', 'income']]
# IPython.display可以在Jupyter notebook中輸出漂亮的格式
display(data.head())

運行結果見表 4-3

表4-3:adult 數據集的前5行
 ageworkclasseducationgenderhours-per-weekoccupationincome
039State-govBachelorsMale40Adm-clerical<=50K
150Self-emp-not-incBachelorsMale13Exec-managerial<=50K
238PrivateHS-gradMale40Handlers-cleaners<=50K
353Private11thMale40Handlers-cleaners<=50K
428PrivateBachelorsFemale40Prof-specialty<=50K

1)檢查字符串編碼的分類數據

讀取完這樣的數據集之后,最好先檢查每一列是否包含有意義的分類數據。在處理人工(比如網站用戶)輸入的數據時,可能沒有固定的類別,拼寫和大小寫也存在差異,因此可能需要預處理。舉個例子,有人可能將性別填為“male”(男性),有人可能填為“man”(男人),而我們希望能用同一個類別來表示這兩種輸入。檢查列的內容有一個好方法,就是使用?pandas Series?(Series?是?DataFrame?中單列對應的數據類型)的?value_counts?函數,以顯示唯一值及其出現次數:

print(data.gender.value_counts())
gender
Male      21790
Female    10771
Name: count, dtype: int64

可以看到,在這個數據集中性別剛好有兩個值:MaleFemale ,這說明數據格式已經很好,可以用 one-hot 編碼來表示。在實際的應用中,你應該查看并檢查所有列的值。為簡潔起見,這里我們將跳過這一步。

pandas 編碼數據有一種非常簡單的方法,就是使用 get_dummies 函數。get_dummies 函數自動變換所有具有對象類型(比如字符串)的列或所有分類的列(這是 pandas 中的一個特殊概念,我們還沒有講到):

print("Original features:\n", list(data.columns), "\n")
data_dummies = pd.get_dummies(data)
print("Features after get_dummies:\n", list(data_dummies.columns))
Original features:['age', 'workclass', 'education', 'gender', 'hours-per-week', 'occupation', 'income'] Features after get_dummies:['age', 'hours-per-week', 'workclass_ ?', 'workclass_ Federal-gov', 'workclass_ Local-gov', 'workclass_ Never-worked', 'workclass_ Private', 'workclass_ Self-emp-inc', 'workclass_ Self-emp-not-inc', 'workclass_ State-gov', 'workclass_ Without-pay', 'education_ 10th', 'education_ 11th', 'education_ 12th', 'education_ 1st-4th', 'education_ 5th-6th', 'education_ 7th-8th', 'education_ 9th', 'education_ Assoc-acdm', 'education_ Assoc-voc', 'education_ Bachelors', 'education_ Doctorate', 'education_ HS-grad', 'education_ Masters', 'education_ Preschool', 'education_ Prof-school', 'education_ Some-college', 'gender_ Female', 'gender_ Male', 'occupation_ ?', 'occupation_ Adm-clerical', 'occupation_ Armed-Forces', 'occupation_ Craft-repair', 'occupation_ Exec-managerial', 'occupation_ Farming-fishing', 'occupation_ Handlers-cleaners', 'occupation_ Machine-op-inspct', 'occupation_ Other-service', 'occupation_ Priv-house-serv', 'occupation_ Prof-specialty', 'occupation_ Protective-serv', 'occupation_ Sales', 'occupation_ Tech-support', 'occupation_ Transport-moving', 'income_ <=50K', 'income_ >50K']

你可以看到,連續特征 agehours-per-week 沒有發生變化,而分類特征的每個可能取值都被擴展為一個新特征:

data_dummies.head()

運行結果如下表:

 agehours-per-weekworkclass_ ?workclass_ Federal-govworkclass_ Local-govworkclass_ Never-workedworkclass_ Privateworkclass_ Self-emp-incworkclass_ Self-emp-not-incworkclass_ State-gov...occupation_ Machine-op-inspctoccupation_ Other-serviceoccupation_ Priv-house-servoccupation_ Prof-specialtyoccupation_ Protective-servoccupation_ Salesoccupation_ Tech-supportoccupation_ Transport-movingincome_ <=50Kincome_ >50K
03940FALSEFALSEFALSEFALSEFALSEFALSEFALSETRUE...FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
15013FALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE...FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
23840FALSEFALSEFALSEFALSETRUEFALSEFALSEFALSE...FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
35340FALSEFALSEFALSEFALSETRUEFALSEFALSEFALSE...FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
42840FALSEFALSEFALSEFALSETRUEFALSEFALSEFALSE...FALSEFALSEFALSETRUEFALSEFALSEFALSEFALSETRUEFALSE

5 rows×46 columns

下面我們可以使用?values?屬性將?data_dummies?數據框(DataFrame?)轉換為 NumPy 數組,然后在其上訓練一個機器學習模型。在訓練模型之前,注意要把目標變量(現在被編碼為兩個?income?列)從數據中分離出來。將輸出變量或輸出變量的一些導出屬性包含在特征表示中,這是構建監督機器學習模型時一個非常常見的錯誤。

注意:pandas?中的列索引包括范圍的結尾,因此?'age':'occupation_Transport-moving'?中包括?occupation_Transport-moving?。這與 NumPy 數組的切片不同,后者不包括范圍的結尾,例如?np.arange(11)[0:10]?不包括索引編號為 10 的元素。

在這個例子中,我們僅提取包含特征的列,也就是從?age?到?occupation_ Transport-moving?的所有列。這一范圍包含所有特征,但不包含目標:

features = data_dummies.loc[:, 'age':'occupation_ Transport-moving']
# 提取NumPy數組
X = features.values
y = data_dummies['income_ >50K'].values
print("X.shape: {}  y.shape: {}".format(X.shape, y.shape))
X.shape: (32561, 44)  y.shape: (32561,)

現在數據的表示方式可以被?scikit-learn?處理,我們可以像之前一樣繼續下一步:

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
print("Test score: {:.2f}".format(logreg.score(X_test, y_test)))
Test score: 0.81

在這個例子中,我們對同時包含訓練數據和測試數據的數據框調用?get_dummies?。這一點很重要,可以確保訓練集和測試集中分類變量的表示方式相同。

假設我們的訓練集和測試集位于兩個不同的數據框中。如果?workclass?特征的?"Private Employee"?取值沒有出現在測試集中,那么?pandas?會認為這個特征只有 3 個可能的取值,因此只會創建 3 個新的虛擬特征。現在訓練集和測試集的特征個數不相同,我們就無法將在訓練集上學到的模型應用到測試集上。更糟糕的是,假設?workclass?特征在訓練集中有?"Government Employee"?和?"Private Employee"?兩個值,而在測試集中有?"Self Employed"?和?"Self Employed Incorporated"?兩個值。在兩種情況下,pandas?都會創建兩個新的虛擬特征,所以編碼后的數據框的特征個數相同。但在訓練集和測試集中的兩個虛擬特征含義完全不同。訓練集中表示?"Government Employee"?的那一列在測試集中對應的是?"Self Employed"?。

如果我們在這個數據上構建機器學習模型,那么它的表現會很差,因為它認為每一列表示的是相同的內容(因為位置相同),而實際上表示的卻是非常不同的內容。要想解決這個問題,可以在同時包含訓練數據點和測試數據點的數據框上調用?get_dummies?,也可以確保調用?get_dummies?后訓練集和測試集的列名稱相同,以保證它們具有相同的語義。

adult 數據集的例子中,分類變量被編碼為字符串。一方面,可能會有拼寫錯誤;但另一方面,它明確地將一個變量標記為分類變量。無論是為了便于存儲還是因為數據的收集方式,分類變量通常被編碼為整數。例如,假設adult?數據集中的人口普查數據是利用問卷收集的,workclass?的回答被記錄為 0(在第一個框打勾)、1(在第二個框打勾)、2(在第三個框打勾),等等。現在該列包含數字 0 到 8,而不是像?"Private"?這樣的字符串。如果有人觀察表示數據集的表格,很難一眼看出這個變量應該被視為連續變量還是分類變量。但是,如果知道這些數字表示的是就業狀況,那么很明顯它們是不同的狀態,不應該用單個連續變量來建模。

分類特征通常用整數進行編碼。它們是數字并不意味著它們必須被視為連續特征。一個整數特征應該被視為連續的還是離散的(one-hot 編碼的),有時并不明確。如果在被編碼的語義之間沒有順序關系(比如?workclass?的例子),那么特征必須被視為離散特征。對于其他情況(比如五星評分),哪種編碼更好取決于具體的任務和數據,以及使用哪種機器學習算法。

pandas?的?get_dummies?函數將所有數字看作是連續的,不會為其創建虛擬變量。為了解決這個問題,你可以使用?scikit-learn?的?OneHotEncoder?,指定哪些變量是連續的、哪些變量是離散的,你也可以將數據框中的數值列轉換為字符串。為了說明這一點,我們創建一個兩列的?DataFrame?對象,其中一列包含字符串,另一列包含整數:

# 創建一個DataFrame,包含一個整數特征和一個分類字符串特征
demo_df = pd.DataFrame({'Integer Feature': [0, 1, 2, 1],'Categorical Feature': ['socks', 'fox', 'socks', 'box']})
display(demo_df)

運行結果見表 4-4

其結果見表 4-4
 Integer FeatureCategorical Feature
00socks
11fox
22socks
31box

使用?get_dummies?只會編碼字符串特征,不會改變整數特征,正如表 4-5 所示。

pd.get_dummies(demo_df)
表4-5:表4-4中數據的one-hot編碼版本,整數特征不變
 Integer FeatureCategorical Feature_boxCategorical Feature_foxCategorical Feature_socks
00FALSEFALSETRUE
11FALSETRUEFALSE
22FALSEFALSETRUE
31TRUEFALSEFALSE

如果你想為“Integer Feature”這一列創建虛擬變量,可以使用?columns?參數顯式地給出想要編碼的列。于是兩個特征都會被當作分類特征處理(見表 4-6):

demo_df['Integer Feature'] = demo_df['Integer Feature'].astype(str)
pd.get_dummies(demo_df, columns=['Integer Feature', 'Categorical Feature'])
表4-6:對表4-4中的數據做one-hot編碼,同時編碼整數特征和字符串特征
 Integer Feature_0Integer Feature_1Integer Feature_2Categorical Feature_boxCategorical Feature_foxCategorical Feature_socks
0TRUEFALSEFALSEFALSEFALSETRUE
1FALSETRUEFALSEFALSETRUEFALSE
2FALSEFALSETRUEFALSEFALSETRUE
3FALSETRUEFALSETRUEFALSEFALSE

附錄

一、參考文獻

參考文獻:[德] Andreas C. Müller [美] Sarah Guido 《Python Machine Learning Basics Tutorial》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13894.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13894.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13894.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

漫談企業信息化安全-綜述

一、前言 一直以來想寫一些文章&#xff0c;談一談企業信息化過程中的安全問題及對策。 隨著信息技術的不斷發展和普及&#xff0c;特別是今年來移動辦公、云服務等等新的工作模式和新的信息技術的應用&#xff0c;企業信息化已經成為提升競爭力、促進創新和發展的重要途徑。…

websocket聊天(全源碼)

區別&#xff1a;我認為的websocket和輪詢的區別 輪詢是客戶端定期向服務端發送請求&#xff0c;目的是獲取的信息 websocket則是服務端直接向客戶端發送想要獲取的信息 配置jdk17 idea 2022 代碼 pom <?xml version"1.0" encoding"UTF-8"?>…

從BIO到NIO到AIO: Java全面IO模型解析

1. Java IO模型概述 Java IO&#xff08;輸入/輸出&#xff09;是Java編程語言中用于數據輸入和輸出的一組功能強大的API。這些API為文件IO、網絡IO以及系統資源IO提供了豐富的類和接口。由于IO操作直接與操作系統交互&#xff0c;因此理解Java IO模型與操作系統模型如何聯系是…

C++ | Leetcode C++題解之第108題將有序數組轉換為二叉搜索樹

題目&#xff1a; 題解&#xff1a; class Solution { public:TreeNode* sortedArrayToBST(vector<int>& nums) {return helper(nums, 0, nums.size() - 1);}TreeNode* helper(vector<int>& nums, int left, int right) {if (left > right) {return nu…

算法學習:快速排序

&#x1f525; 個人主頁&#xff1a;空白詩 文章目錄 &#x1f680; 引言&#x1f4cc; 快速排序算法核心思想1. 選擇基準值&#xff08;Pivot&#xff09;2. 分區操作&#xff08;Partitioning&#xff09;3. 遞歸排序子序列 &#x1f4cc; JavaScript 實現1. 快速排序主函數2…

基于Perfetto 解讀一幀的生產消費流程 Android >= S Qualcomm

廣告 首先幫我朋友打個廣告 我們一起在運營一個視頻號 感興趣的可以幫忙點擊右邊這個小鈴鐺 鈴鐺 序 1.這個流程里面的東西如果展開其實是有很多的 內容其實還是比較淺顯的 sf處就不貼源碼了 關一個Vsync就有的解釋 當然筆者在流程上先形成一個思維閉環 2.如有小伙伴需要 筆…

Java方法的遞歸

Java方法的遞歸 前言一、遞歸的概念示例代碼示例 二、遞歸執行過程分析代碼示例執行過程圖 三、遞歸練習代碼示例按順序打印一個數字的每一位(例如 1234 打印出 1 2 3 4)遞歸求 1 2 3 ... 10寫一個遞歸方法&#xff0c;輸入一個非負整數&#xff0c;返回組成它的數字之和. …

零基礎學Java第二十一天之IIO流之對象流

IO流之對象流 1、對象流 1、理解 將對象寫入到文件&#xff0c;將文件里的對象讀取到程序中 class ObjectInputStream – 對象輸入流 class ObjectOutputStream – 對象輸出流 序列化/鈍化&#xff1a;程序里的對象 寫入到 文件中 反序列化/活化&#xff1a;文件中的對象 讀取…

【OpenCV實戰】OpenCV實現自動調整亮度和對比度

一,基于局部直方圖信息增強算法 對比度受限的自適應直方圖均衡化(Contrast Limited Adaptive Histogram Equalization,簡稱CLAHE)是一種用于圖像增強的技術,其原理主要基于自適應直方圖均衡化(Adaptive Histogram Equalization,簡稱AHE)但增加了對比度限制來避免過度放…

uniapp藍牙打印圖片

前言 這是個藍牙打印圖片的功能&#xff0c;業務是打印界面固定的demo范圍&#xff0c;這里通過html2canvas插件生成的圖片base64&#xff0c;然后圖片base64繪制到canvas中去后&#xff0c;獲取canvas中的像素信息&#xff0c;然后對像素信息進行一個灰度值處理&#xff0c;灰…

在Linux系統中解決Java生成海報文字亂碼和缺少字體文件的問題

在Linux系統中,如果缺少特定的字體文件,可以通過以下幾種方法來解決: 1. 安裝系統字體包 大多數Linux發行版提供了各種字體包,可以通過包管理器安裝這些字體包。例如,在Debian/Ubuntu系統上,可以使用以下命令安裝常見的字體包: # 安裝基本的字體包 sudo apt-get updat…

Java集合的組內平均值怎么計算

要計算Java集合&#xff08;例如List或Set中的Integer、Double或其他數值類型的對象&#xff09;的組內平均值&#xff0c;我們需要遍歷這個集合&#xff0c;累加所有的元素值&#xff0c;然后除以集合的大小&#xff08;即元素的數量&#xff09;。以下是一個詳細的步驟說明和…

opencl色域變換,處理傳遞顯存數據

在使用ffmpeg解碼后的多路解碼數據非常慢&#xff0c;還要給AI做行的加速方式是在顯存處理數據&#xff0c;在視頻拼接融合產品的產品與架構設計中&#xff0c;提出了比較可靠的方式是使用cuda&#xff0c;那么沒有cuda的顯卡如何處理呢 &#xff0c;比較好的方式是使用opencl來…

go語言的一些常見踩坑問題

開始之前&#xff0c;介紹一下?最近很火的開源技術&#xff0c;低代碼。 作為一種軟件開發技術逐漸進入了人們的視角里&#xff0c;它利用自身獨特的優勢占領市場一角——讓使用者可以通過可視化的方式&#xff0c;以更少的編碼&#xff0c;更快速地構建和交付應用軟件&#…

安卓手機APP開發__網絡連接性支持VPN

安卓手機APP開發__網絡連接性支持VPN 安卓提供了API給開發者,來創建一個虛擬的私有網絡(VPN)的解決方案. 根據這里的介紹,你能知道如何開發和測試你的針對安卓設備的VPN的客戶端. 概述 VPN允許設備為了安全地連接網絡,而沒有物理性的連接在一個網絡上. 安卓包括了一個內嵌的…

【無重復字符的最長子串】python,滑動窗口+哈希表

滑動窗口哈希表 哈希表 seen 統計&#xff1a; 指針 j遍歷字符 s&#xff0c;哈希表統計字符 s[j]最后一次出現的索引 。 更新左指針 i &#xff1a; 根據上輪左指針 i 和 seen[s[j]]&#xff0c;每輪更新左邊界 i &#xff0c;保證區間 [i1,j] 內無重復字符且最大。 更新結…

使用JSDOM安全截斷文章HTML內容

在Web開發中&#xff0c;經常需要處理大量的HTML內容&#xff0c;尤其是在展示文章預覽、動態加載內容或限制顯示長度等場景中。直接截斷HTML字符串可能會導致頁面布局混亂、樣式錯誤或標簽不完整等問題。為了安全地截斷HTML內容&#xff0c;我們可以利用jsdom庫來解析HTML&…

JVM學習-垃圾回收器(一)

垃圾回收器 按線程數分類 串行垃圾回收器 串行回收是在同一時間段內只允許有一個CPU用于執行垃圾回收操作&#xff0c;此時工作線程被暫停&#xff0c;直至垃圾收集工作結束 在諸如單CPU處理器或者較小的應用內存等硬件平臺不是特別優越的場合&#xff0c;串行回收器的性能表…

http和https的區別,怎么免費實現https(內涵教學)

超文本傳輸協議HTTP協議被用于在Web瀏覽器和網站服務器之間傳遞信息&#xff0c;HTTP協議以明文方式發送內容&#xff0c;不提供任何方式的數據加密&#xff0c;如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文&#xff0c;就可以直接讀懂其中的信息&#xff0c;因此&…

etcd 和 MongoDB 的混沌(故障注入)測試方法

最近在對一些自建的數據庫 driver/client 基礎庫的健壯性做混沌&#xff08;故障&#xff09;測試, 去驗證了解業務的故障處理機制和恢復時長. 主要涉及到了 MongoDB 和 etcd 這兩個基礎組件. 本文會介紹下相關的測試方法. MongoDB 中的故障測試 MongoDB 是比較世界上熱門的文…