用隨機森林算法進行的一次故障預測

本案例將帶大家使用一份開源的S.M.A.R.T.數據集和機器學習中的隨機森林算法,來訓練一個硬盤故障預測模型,并測試效果。

實驗目標

  1. 掌握使用機器學習方法訓練模型的基本流程;
  2. 掌握使用pandas做數據分析的基本方法;
  3. 掌握使用scikit-learn進行隨機森林模型的構建、訓練、保存、加載、預測、統計準確率指標和查看混淆矩陣的方法;

案例內容介紹

隨著互聯網、云計算的發展,數據的存儲需求與日倍增,大規模海量數據存儲中心是必不可少的基礎性設施。雖然新的存儲介質例如SSD,已經很多方面擁有了比磁盤更好的性能,但就目前來講,其高昂的花費仍然使大部分數據中心難以負擔,因此,大型數據中心依然會采用傳統的機械硬盤作為存儲介質。

機械硬盤生命周期通常為3到5年,在2到3年后故障率明顯升高,導致換盤量陡增。據統計,在服務器硬件故障中,硬盤故障占比達到48%+,是影響服務器運行可靠性的重要因素。早在上個世紀九十年代,人們就意識到數據的寶貴性遠勝于硬盤自身價值,渴望有種技術能對硬盤故障進行預測并實現相對安全的數據保護,因此S.M.A.R.T.技術應運而生。

S.M.A.R.T.,全稱為“Self-Monitoring Analysis and Reporting Technology”,即“自我監測、分析及報告技術”,是一種自動的硬盤狀態檢測與預警系統和規范。通過在硬盤硬件內的檢測指令對硬盤的硬件如磁頭、盤片、馬達、電路的運行情況進行監控、記錄并與廠商所設定的預設安全值進行比較,若監控情況將或已超出預設安全值的安全范圍,就可以通過主機的監控硬件或軟件自動向用戶作出警告并進行輕微的自動修復,以提前保障硬盤數據的安全。除一些出廠時間極早的硬盤外,現在大部分硬盤均配備該項技術。關于該技術的更多介紹,請查看S.M.A.R.T.-百度百科。

雖然硬盤廠商采用了S.M.A.R.T.技術來監測硬盤的健康狀態,但是大多數廠商都是基于設計規則制定的故障預測手段,預測效果非常差,不能滿足日漸嚴格的提前預測硬盤故障的需求。因此,業界期望使用機器學習技術來構建硬盤故障預測的模型,更準確地提前感知硬盤故障,降低運維成本,提升業務體驗。

本案例將帶大家使用一份開源的S.M.A.R.T.數據集和機器學習中的隨機森林算法,來訓練一個硬盤故障預測模型,并測試效果。

注意事項

  1. 如果你是第一次使用 JupyterLab,請查看《ModelAtrs JupyterLab使用指導》了解使用方法;
  2. 如果你在使用 JupyterLab 過程中碰到報錯,請參考《ModelAtrs JupyterLab常見問題解決辦法》嘗試解決問題。

實驗步驟

1. 數據集介紹

本案例使用的數據集是來自于Backblaze公司的開源數據集,它是一家計算機備份和云存儲服務提供商。自2013年以來,Backbreze每年都會公開發布他們的數據中心所使用硬盤的S.M.A.R.T.日志數據,有效地推動了使用機器學習技術進行硬盤故障預測的發展。

由于Backblaze公司發布的S.M.A.R.T.日志數據量較大,本案例為快速演示使用機器學習構建硬盤故障預測模型的過程,僅使用了該公司發布的2020年的數據,相關數據已經準備好,放在OBS中,運行如下代碼即可下載這部分數據。

import os
import moxing as mox
if not os.path.exists('./dataset_2020'):mox.file.copy('obs://modelarts-labs-bj4-v2/course/ai_in_action/2021/machine_learning/hard_drive_disk_fail_prediction/datasets/dataset_2020.zip', './dataset_2020.zip')os.system('unzip dataset_2020.zip')if not os.path.exists('./dataset_2020'):raise Exception('錯誤!數據不存在!')!ls -lh ./dataset_2020
INFO:root:Using MoXing-v1.17.3-INFO:root:Using OBS-Python-SDK-3.20.7
total 102M-rw-r--r-- 1 ma-user ma-group  51M Mar 21 11:56 2020-12-08.csv-rw-r--r-- 1 ma-user ma-group  51M Mar 21 11:56 2020-12-09.csv-rw-r--r-- 1 ma-user ma-group 1.2M Mar 21 11:55 dataset_2020.csv-rw-r--r-- 1 ma-user ma-group 3.5K Mar 22 15:59 prepare_data.py

數據解釋:

2020-12-08.csv:從backblaze公司發布的2020 Q4數據集中抽取出來的2020-12-08這天的S.M.A.R.T.日志數據
2020-12-09.csv:從backblaze公司發布的2020 Q4數據集中抽取出來的2020-12-09這天的S.M.A.R.T.日志數據
dataset_2020.csv:已經處理過的2020年全年S.M.A.R.T.日志數據,下文中“第2.6節 類別均衡度分析”會解釋如何得到這部分數據
prepare_data.py: 運行該腳本,會下載2020年全年S.M.A.R.T.日志數據,并進行處理,得到dataset_2020.csv。運行該腳本需要20G的本地存儲空間

2. 數據分析

使用機器學習構建任何模型之前,都需要先對數據集進行分析,了解數據集的規模、屬性名、屬性值、各類統計指標及空值情況。因為我們要先了解數據,才能用好數據。

2.1 讀取csv文件

pandas是常用的python數據分析模塊,我們先用它來加載數據集中的csv文件。以2020-12-08.csv為例,我們先加載該文件來分析S.M.A.R.T.日志數據的情況

import pandas as pd
df_data = pd.read_csv("./dataset_2020/2020-12-08.csv")
type(df_data)
pandas.core.frame.DataFrame

2.2 查看單個csv文件數據的規模

print('單個csv文件數據的規模,行數:%d, 列數:%d' % (df_data.shape[0], df_data.shape[1]))
單個csv文件數據的規模,行數:162008, 列數:149

2.3 查看頭5行數據

使用pandas加載csv后,得到的是一個DataFrame對象,可以理解為一個表格,調用該對象的head()函數,可以查看表格的頭5行數據

df_data.head()

<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }

.dataframe tbody tr th {vertical-align: top;
}
.dataframe thead th {text-align: right;
}

</style>

5 rows × 149 columns

如上所示是表格的頭5行數據,表頭是屬性名,屬性名下面是屬性值,backblaze網站解釋了屬性值的含義,翻譯為如下:

2.4 查看數據的統計指標

查看完表格的頭5行數據,我們再調用DataFrame對象的describe()函數,計算表格數據的統計指標

df_data.describe()

<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }

.dataframe tbody tr th {vertical-align: top;
}
.dataframe thead th {text-align: right;
}

</style>

8 rows × 146 columns

如上所示是表格數據的統計指標,describe()函數默認對數值類型的列進行統計分析,由于表格的前三列’date’、‘serial_number’、'model’是字符串類型,所以這三列沒有統計指標。

各行統計指標的含義解釋如下:

count: 該列有多少個非空值
mean: 該列的均值
std: 該列數值的標準差
min: 該列數值的最小值
25%: 該列數值的25%中位值
50%: 該列數值的50%中位值
75%: 該列數值的75%中位值
max: 該列數值的最大值

2.5 查看數據空值情況

從上面的輸出可以觀察到,某些屬性的count指標比較小,比如smart_2_raw的count數就比df_train的總行數要小很多,因此我們要再進一步看看各列屬性的空值情況,執行如下代碼可以查看空值情況

df_data.isnull().sum()
date                         0
serial_number 0
model                        0
capacity_bytes 0
failure                      0
smart_1_normalized         179
smart_1_raw                179
smart_2_normalized      103169
smart_2_raw             103169
smart_3_normalized        1261
smart_3_raw               1261
smart_4_normalized        1261
smart_4_raw               1261
smart_5_normalized        1221
smart_5_raw               1221
smart_7_normalized        1261
smart_7_raw               1261
smart_8_normalized      103169
smart_8_raw             103169
smart_9_normalized         179
smart_9_raw                179
smart_10_normalized       1261
smart_10_raw              1261
smart_11_normalized     161290
smart_11_raw            161290
smart_12_normalized        179
smart_12_raw               179
smart_13_normalized     161968
smart_13_raw            161968
smart_15_normalized     162008... 
smart_232_normalized    160966
smart_232_raw           160966
smart_233_normalized    160926
smart_233_raw           160926
smart_234_normalized    162008
smart_234_raw           162008
smart_235_normalized    160964
smart_235_raw           160964
smart_240_normalized     38968
smart_240_raw            38968
smart_241_normalized     56030
smart_241_raw            56030
smart_242_normalized     56032
smart_242_raw            56032
smart_245_normalized    161968
smart_245_raw           161968
smart_247_normalized    162006
smart_247_raw           162006
smart_248_normalized    162006
smart_248_raw           162006
smart_250_normalized    162008
smart_250_raw           162008
smart_251_normalized    162008
smart_251_raw           162008
smart_252_normalized    162008
smart_252_raw           162008
smart_254_normalized    161725
smart_254_raw           161725
smart_255_normalized    162008
smart_255_raw           162008
Length: 149, dtype: int64

這種顯示方式不太方便查看,我們把可以空值的數量繪制成曲線圖,看起來更直觀

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
df_data_null_num = df_data.isnull().sum()
x = list(range(len(df_data_null_num)))
y = df_data_null_num.values
plt.plot(x, y)
plt.show()

從上面的結果可以看出,表格中的某些屬性有大量的空值。

在機器學習領域中,數據集中存在空值是很常見的現象,引起空值的原因有很多種,比如一份用戶畫像中有很多個屬性,但又不是所有用戶都有對應的屬性值,這時就產生了空值。或者某些數據因為傳輸超時,導致沒有采集上來,也可能會出現空值。

2.6 類別均衡度分析

我們要實現的任務是“硬盤故障預測”,即預測某個硬盤在某個時間是正常還是損壞,這就是一個故障預測問題或異常檢測問題,這類問題有個特點就是:正常樣本非常多,故障樣本非常少,兩類樣本的數量差異非常大。
比如,執行如下代碼,可以看到df_data中硬盤正常的樣本有16萬個以上,故障的樣本卻只有8個,類別極度不均衡。

valid = df_data[df_data['failure'] == 0]
failed = df_data[df_data['failure'] == 1]
print("valid hdds:",len(valid))
print("failed hdds:",len(failed))
valid hdds: 162000
failed hdds: 8

由于大多數機器學習方法的學習過程都是基于統計學的思路來進行學習的,如果直接使用上面這樣類別不均衡的數據進行訓練,那么模型的能力可能會明顯偏向于類別多的樣本,類別少的樣本就會被“淹沒”掉了,在學習過程中發揮不了作用,因此我們需要平衡不同類別的數據。

為了獲得更多的故障樣本數據,我們可以從backblaze公司發布的2020年全年S.M.A.R.T.日志數據中將所有的故障樣本都挑選出來,同時也隨機挑出相同數量的正常樣本,可以通過下面的代碼來實現。

這段代碼已被注釋掉,如需運行,需要20G的本地存儲空間。您也可以不必運行這段代碼,因為本案例開頭已經下載了dataset_2020.zip,這個壓縮包中已經提供了dataset_2020.csv,該csv就是運行下面這段代碼得到的文件

# if not os.path.exists('./dataset_2020/dataset_2020.csv'):
#     os.system('python ./dataset_2020/prepare_data.py')
import gc
del df_data # 刪除 df_data 對象
gc.collect() # 回收內存
2655

2.7 加載類別均衡的數據集

dataset_2020.csv是已經經過類別均衡處理的硬盤S.M.A.R.T.日志數據,下面我們加載該文件,再確認一下類別均衡情況

df_data = pd.read_csv("./dataset_2020/dataset_2020.csv")
valid = df_data[df_data['failure'] == 0]
failed = df_data[df_data['failure'] == 1]
print("valid hdds:", len(valid))
print("failed hdds:", len(failed))
valid hdds: 1497
failed hdds: 1497

可以看到,正常樣本和故障樣本都是1497個

3. 特征工程

準備好可用的訓練集之后,接下來要做特征工程,通俗地講,特性工程就是要選擇表格中的哪些屬性來構建機器學習模型。人工設計特征的好壞,很大程度上決定了機器學習模型效果的好壞,所以機器學習領域的研究人員需耗費大量精力在人工設計特征上,是一項比較耗時、耗力,且需要專家經驗的工程。

3.1 SMART屬性與硬盤故障的相關研究

(1)BackBlaze分析了其HDD故障和SMART屬性之間的相關性,并發現了SMART 5、187、188、197、198與HDD故障的相關率最高,這些SMART屬性還與掃描錯誤,重新分配計數和試用計數有關[1];
(2)El-Shimi等發現在隨機森林模型中除了以上5個特征外,還有SMART 9、193、194、241、242這5個屬性有最大權重[2];
(3)Pitakrat等人評估了21種用于預測硬盤故障的機器學習算法,發現在測試的21種機器學習算法中,隨機森林算法在ROC曲線下有最大面積,而KNN分類器具有最高的F1值[3];
(4)Hughes等人也研究用于預測硬盤故障的機器學習方法,他們分析了SVM、樸素貝葉斯的表現,SVM實現了最高性能,檢測率為50.6%,誤報率為0%[4];

[1] Klein, Andy. “What SMART Hard Disk Errors Actually Tell Us.” Backblaze Blog Cloud Storage & Cloud Backup,6 Oct. 2016,?www.backblaze.com/blog/what-smart-stats-indicate-hard-drive-failures/
[2] El-Shimi, Ahmed. “Predicting Storage Failures.” VAULT-Linux Storage and File Systems Conference.VAULT-Linux Storage and File Systems Conference, 22 Mar. 2017, Cambridge.
[3] Pitakrat, Teerat, André van Hoorn, and Lars Grunske. “A comparison of machine learning algorithms for proactive hard disk drive failure detection.” Proceedings of the 4th international ACM Sigsoft symposium on Architecting critical systems. ACM, 2013.
[4] Hughes, Gordon F., et al. “Improved disk-drive failure warnings.” IEEE Transactions on Reliability 51.3 (2002):350-357.

如上就是前人的一些研究成果,本案例計劃采用隨機森林模型,因此可以根據上面第2條研究成果,選擇SMART 5, 9, 187, 188, 193, 194, 197, 198, 241, 242這些屬性來作為特征,它們的含義分別是:

SMART 5: 重映射扇區計數
SMART 9: 通電時間累計
SMART 187: 無法校正的錯誤
SMART 188: 指令超時計數
SMART 193: 磁頭加載/卸載計數
SMART 194: 溫度
SMART 197: 等待被映射的扇區數
SMART 198: 報告給操作系統的無法通過硬件ECC校正的錯誤
SMART 241: 邏輯塊尋址模式寫入總數
SMART 242: 邏輯塊尋址模式讀取總數

另外,由于不同硬盤廠商的不同型號硬盤記錄SMART日志數據的標準可能不一樣,所以我們最好將同一型號的硬盤數據挑出來作為訓練數據,專門訓練一個預測該型號硬盤是否故障的模型。如果需要預測多個不同型號的硬盤是否故障,則可能需要分別訓練多個模型。

3.2 硬盤型號選擇

執行下面的代碼,看一下每種型號的硬盤數據量有多少

df_data.model.value_counts()
ST12000NM0007 664
ST4000DM000 491
ST8000NM0055 320
ST12000NM0008 293
TOSHIBA MG07ACA14TA 212
ST8000DM002 195
HGST HMS5C4040BLE640 193
HGST HUH721212ALN604 153
TOSHIBA MQ01ABF050 99
ST12000NM001G 53
HGST HMS5C4040ALE640 50
ST500LM012 HN 40
TOSHIBA MQ01ABF050M 35
HGST HUH721212ALE600 34
ST10000NM0086 29
ST14000NM001G 23
HGST HUH721212ALE604 21
ST500LM030 15
HGST HUH728080ALE600 14
Seagate BarraCuda SSD ZA250CM10002 12
WDC WD5000LPVX 11
WDC WUH721414ALE6L4 10
ST6000DX000 9
TOSHIBA MD04ABA400V 3
Seagate SSD 2
ST8000DM004 2
ST18000NM000J 2
ST4000DM005 2
WDC WD5000LPCX 1
ST8000DM005 1
DELLBOSS VD 1
HGST HDS5C4040ALE630 1
TOSHIBA HDWF180 1
HGST HUS726040ALE610 1
ST16000NM001G 1
Name: model, dtype: int64

可以看到 ST12000NM0007 型號的硬盤數據量最多,因此我們把該型號硬盤的數據過濾出來

df_data_model = df_data[df_data['model'] == 'ST12000NM0007']

3.3 特征選擇

選取上文提到的10個屬性作為特征

features_specified = []
features = [5, 9, 187, 188, 193, 194, 197, 198, 241, 242]
for feature in features:features_specified += ["smart_{0}_raw".format(feature)]
X_data = df_data_model[features_specified]
Y_data = df_data_model['failure']
X_data.isnull().sum()
smart_5_raw      1
smart_9_raw      1
smart_187_raw    1
smart_188_raw    1
smart_193_raw    1
smart_194_raw    1
smart_197_raw    1
smart_198_raw    1
smart_241_raw    1
smart_242_raw    1
dtype: int64

有空值存在,所以先要填充空值

X_data = X_data.fillna(0) 
print("valid hdds:", len(Y_data) - np.sum(Y_data.values))
print("failed hdds:", np.sum(Y_data.values))
valid hdds: 325
failed hdds: 339

3.4 劃分訓練集和測試集

使用sklearn的train_test_split即可劃分訓練集和測試集,test_size表示測試集的比例,一般取值為0.3、0.2或0.1

from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X_data, Y_data, test_size=0.2, random_state=0) 

4. 開始訓練

4.1 構建模型

準備好訓練集和測試集之后,就可以開始構建模型了,構建模型的步驟非常簡單,直接調用機器學習框架sklearn中的RandomForestClassifier即可

from sklearn.ensemble import RandomForestClassifier 
rfc = RandomForestClassifier()

隨機森林算法的超參數有很多個,取不同的參數值構建模型會得到不同的訓練效果,對于初學者,可以直接使用庫中提供的默認參數值,在對隨機森林算法的原理有一定的了解之后,可以嘗試修改模型的參數來調整模型的訓練效果。

4.2 數據擬合

模型訓練的過程,也就是擬合訓練數據的過程,實現也非常簡單,調用fit函數即可開始訓練

rfc.fit(X_train, Y_train)
/home/ma-user/anaconda3/envs/XGBoost-Sklearn/lib/python3.6/site-packages/sklearn/ensemble/forest.py:248: FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22."10 in version 0.20 to 100 in 0.22.", FutureWarning)
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',max_depth=None, max_features='auto', max_leaf_nodes=None,min_impurity_decrease=0.0, min_impurity_split=None,min_samples_leaf=1, min_samples_split=2,min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=None,oob_score=False, random_state=None, verbose=0,warm_start=False)

5 開始預測

調用predict函數即可開始預測

Y_pred = rfc.predict(X_test) 

5.1 統計預測準確率

在機器學習中,分類問題的性能指標,常用的有四種:accuracy(精度)、precision(查準率)、recall(查全率)、F1-Score,四種指標越接近1,表示效果越好。sklearn庫中有這四種指標的函數,直接調用即可。

關于四種指標的理論解釋,可參考此視頻

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
print("Model used is: Random Forest classifier") 
acc = accuracy_score(Y_test, Y_pred) 
print("The accuracy is {}".format(acc)) 
prec = precision_score(Y_test, Y_pred) 
print("The precision is {}".format(prec)) 
rec = recall_score(Y_test, Y_pred) 
print("The recall is {}".format(rec)) 
f1 = f1_score(Y_test, Y_pred) 
print("The F1-Score is {}".format(f1)) 
Model used is: Random Forest classifier
The accuracy is 0.8270676691729323
The precision is 0.8548387096774194
The recall is 0.7910447761194029
The F1-Score is 0.8217054263565892

每次進行隨機森林模型的訓練,會得到該模型不同的測試準確率指標,這是由于隨機森林算法的訓練過程具有一定的隨機性導致的,是正常現象。但是同一模型、同一樣本的預測結果是確定不變的。

5.2 模型保存、加載、再預測

模型保存

import pickle
with open('hdd_failure_pred.pkl', 'wb') as fw:pickle.dump(rfc, fw)

模型加載

with open('hdd_failure_pred.pkl', 'rb') as fr:new_rfc = pickle.load(fr)

模型再預測

new_Y_pred = new_rfc.predict(X_test)
new_prec = precision_score(Y_test, new_Y_pred)
print("The precision is {}".format(new_prec))
The precision is 0.8548387096774194

5.3 查看混淆矩陣

要分析分類模型的效果如何,還可以使用混淆矩陣來查看,混淆矩陣的橫軸表示預測結果的各個類別,縱軸表示真實標簽的類別,矩陣方格中的值就代表對應橫縱坐標重疊的測試樣本數量。

import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix 
LABELS = ['Healthy', 'Failed'] 
conf_matrix = confusion_matrix(Y_test, Y_pred) 
plt.figure(figsize =(6, 6)) 
sns.heatmap(conf_matrix, xticklabels = LABELS, yticklabels = LABELS, annot = True, fmt ="d"); 
plt.title("Confusion matrix") 
plt.ylabel('True class') 
plt.xlabel('Predicted class') 
plt.show() 

6. 改進模型的思路

如上內容是使用隨機森林算法構建硬盤故障預測模型的過程演示,模型精度并不算高,有如下幾個思路可以提升模型的精度:

(1)本案例只使用了Backblaze公司2020年的數據,您可以嘗試使用更多的訓練數據;
(2)本案例只使用了10個SMART屬性作為特征,您可以嘗試使用其他方法來構建特征;
(3)本案例使用了隨機森林算法來訓練模型,您可以嘗試使用其他的機器學習算法;

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

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

相關文章

三大常用集合

1.Set集合 在Java中&#xff0c;Set是一種集合類型&#xff0c;它是一種不允許包含重復元素的集合&#xff0c;每個元素在Set中是唯一的。Set接口的常用實現類有HashSet、TreeSet和LinkedHashSet。以下是關于Set集合的一些重要特點和用法&#xff1a; 特點&#xff1a; 不允…

什么是mysql的回表操作

MySQL中的“回表”操作是指在執行查詢時&#xff0c;由于索引結構的限制&#xff0c;數據庫系統需要從非聚集索引&#xff08;Secondary Index&#xff09;中找到主鍵值&#xff0c;然后使用這些主鍵值回溯到聚集索引&#xff08;Clustered Index&#xff09;中獲取完整的行數據…

珠江電纜,承載您夢想的每一度電

在現代社會&#xff0c;電力無處不在&#xff0c;它不僅是經濟發展的動力&#xff0c;更是每個人生活中不可或缺的能量來源。而在這個電力驅動的世界里&#xff0c;有一家企業默默地承載著千家萬戶的夢想&#xff0c;它就是珠江電纜。 連接夢想的每一度電 珠江電纜成立于2001…

使用Java實現單元測試:JUnit教程

使用Java實現單元測試&#xff1a;JUnit教程 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在軟件開發中&#xff0c;單元測試是保證代碼質量和功能正確性的重要手段之一。JUnit是Java語言中最流行…

絕區零國際服下載 一鍵下載絕區零國際服教程

絕區零是一款米哈游傾情打造的全新都市幻想動作角色扮演游戲。在游戲中&#xff0c;我們將扮演一名繩匠&#xff0c;這是為出于各種原因需要進入危險空洞的人提供指引的專業人士。您將與獨特的角色一起踏上冒險之旅&#xff0c;攜手探索空洞&#xff0c;對戰強大敵人&#xff0…

【狀態估計】線性高斯系統的狀態估計——離散時間的遞歸濾波

前兩篇文章介紹了離散時間的批量估計、離散時間的遞歸平滑&#xff0c;本文著重介紹離散時間的遞歸濾波。 前兩篇位置&#xff1a;【狀態估計】線性高斯系統的狀態估計——離散時間的批量估計、【狀態估計】線性高斯系統的狀態估計——離散時間的遞歸平滑。 離散時間的遞歸濾波…

ollama將模型永遠加載在顯存里

問題解析 我們在使用ollma部署大語言模型的時候,如果部署的模型尺寸較大,往往在第一次加載的時候需要花費大量的時間加載模型;等加載完成后,如果長時間不調用模型,我們會發現模型已經被釋放掉了,又要重新加載,導致體驗感極差. 這是為什么呢?因為在沒被調用時,ollama默認在顯…

Steam夏促怎么注冊 Steam夏促賬號注冊教程

隨著夏日的炙熱漸漸充斥著每一個角落&#xff0c;Steam平臺也趕來添熱鬧&#xff0c;推出了一系列讓人眼前一亮的夏季促銷活動。如果你也是游戲愛好者&#xff0c;我們肯定不能錯過這次的steam夏促。正直本次夏日促銷有著很多的游戲迎來史低和新史低&#xff0c;有各種各樣的游…

20240703在飛凌OK3588-C開發板上刷Rockchip原廠的Buildroot20220811

20240703在飛凌OK3588-C開發板上刷Rockchip原廠的Buildroot20220811 2024/7/3 18:25 詳細的刷機LOG&#xff1a; [BEGIN] 2024/7/3 18:18:49 rootRK3588:/# DDR Version V1.07 20220412 LPDDR4X, 2112MHz channel[0] BW16 Col10 Bk8 CS0 Row16 CS1 Row16 CS2 Die BW16 Size204…

TP8/6 更改后臺入口地址admin改為myadmin 隱藏真實后臺網址

原來www.xxx.com/admin 改后www.xxx.com/myadmin config/app.php // 應用映射&#xff08;自動多應用模式有效&#xff09;app_map > [admintest>admin],

JavaScript 實用技巧(二)

JavaScript 實用技巧&#xff1a;提升你的編程效率 JavaScript 是一種廣泛使用和極具表現力的編程語言。為了幫助你更高效地編寫代碼&#xff0c;本文將介紹一些實用的 JavaScript 技巧。掌握這些技巧將有助于提高你的編程速度和代碼質量。 1. 交換變量的值 不需要使用臨時變…

為何同一PDF文檔用不同軟件打印效果不同?

通過掃描儀生成的同一PDF文檔&#xff0c;同樣的設置&#xff0c;為什么別的電腦打出來是白底我的打出來有灰色格子背景&#xff1f;這種情況通常是由于PDF閱讀軟件的不同造成的差異。 ### 可能的原因和解決方法&#xff1a; 1. **PDF閱讀軟件的不同**&#xff1a; - **解決方…

Vue3輕松創建交互式儀表盤

本文由ScriptEcho平臺提供技術支持 項目地址&#xff1a;傳送門 基于 Plotly.js 的 Vue 儀表盤組件 應用場景介紹 儀表盤是一種交互式可視化工具&#xff0c;用于監控和分析關鍵指標。它廣泛應用于各種行業&#xff0c;例如金融、醫療保健和制造業。 代碼基本功能介紹 本…

FFmpeg 命令行 音視頻格式轉換

&#x1f4da;&#xff1a;FFmpeg 提供了豐富的命令行選項和功能&#xff0c;可以用來處理音視頻文件、流媒體等&#xff0c;掌握命令行的使用&#xff0c;可以有效提高工作效率。 目錄 一、視頻轉換和格式轉換 &#x1f535; 將視頻文件轉換為另一種格式 &#x1f535; 指定…

12個驚艷的可視化大屏:解鎖數據之美,洞見未來趨勢

在數字化轉型的浪潮中&#xff0c;可視化大屏以其獨特的魅力和強大的功能&#xff0c;成為了企業展示數據、洞察趨勢的重要窗口。我們將一同探索12個驚艷的可視化大屏案例&#xff0c;感受數據之美&#xff0c;洞見未來趨勢。 可視化大屏&#xff0c;作為數據可視化的高級形態…

vue3繪制廣東深圳地圖使用echarts

<!-- 餅圖 --> <template><el-card><template #header> 地級市分類圖 </template><div :id"id" :class"className" :style"{ height, width }"></div></el-card> </template><script …

徹底學會Gradle插件版本和Gradle版本及對應關系

看完這篇&#xff0c;保你徹底學會Gradle插件版本和Gradle版本及對應關系&#xff0c;超詳細超全的對應關系表 需要知道Gradle插件版本和Gradle版本的對應關系&#xff0c;其實就是需要知道Gradle插件版本對應所需的gradle最低版本&#xff0c;詳細對應關系如下表格&#xff0…

Lua、AB包熱更新總結

1.AB包熱更新 &#xff08;1&#xff09;AB包是一種特定的壓縮文件&#xff0c;可以放模型貼圖音效等等 &#xff08;2&#xff09;Resources目錄下打包時只讀 無法修改&#xff1b;而AB包存儲的位置是自定義的&#xff0c;能夠動態更新&#xff0c;同時可以決定資源包初始的大…

0703_ARM7

練習&#xff1a; 封裝exti&#xff0c;cic初始化函數 //EXTI初始化 void hal_key_exti_init(int id,int exticr,int mode){//獲取偏移地址int address_offset (id%4)*8;//獲取寄存器編號int re_ser (id/4)1;//printf("address_offset%d,re_ser%d\n",address_o…

Excel中按列的首行字母順序,重新排列(VBA腳本)

排序前 要求對4列數據按照第一行abcd的順序排列 VB腳本如下&#xff1a; 要使用這個腳本&#xff0c;請按照以下步驟操作&#xff1a; 打開Excel&#xff0c;然后按下 Alt F11 打開VBA編輯器。在VBA編輯器中&#xff0c;選擇“插入” > “模塊”&#xff0c;在打開的模塊…