国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

R語言:鑒于計算10億以內(nèi)訓(xùn)練模型記錄for循環(huán)的加速

這篇具有很好參考價值的文章主要介紹了R語言:鑒于計算10億以內(nèi)訓(xùn)練模型記錄for循環(huán)的加速。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1 前言

筆者主力機(jī)是MBAM1芯片(8+256),某個下午鞏固循環(huán)突然思考到個問題,小循環(huán)很快就能run出來,中循環(huán)還勉勉強(qiáng)強(qiáng),稍微上點強(qiáng)度就運行的很慢。雖然是CPU占用100%,8顆核心好像是偷著懶跑的,但是丟給我那臺4核心8線程黑蘋果,是跑滿的,說明ARM在多線程的時候,有點東西

下圖是計算一個10億內(nèi)訓(xùn)練模型時的top

R語言:鑒于計算10億以內(nèi)訓(xùn)練模型記錄for循環(huán)的加速

2 幾個循環(huán)

2.1 100以內(nèi)的和

### for
sum <- 0
for (i in 1:100) {
  sum <- sum + i
}
print(sum)

### while
sum <- 0
i <- 1
while (i <= 100) {
  sum <- sum + i
  i <- i + 1
}
print(sum)

2.2 100以內(nèi)奇數(shù)和/偶數(shù)和

### for
odd_sum <- 0
even_sum <- 0

for (i in 1:100) {
  if (i %% 2 == 0) {
    even_sum <- even_sum + i
  } else {
    odd_sum <- odd_sum + i
  }
}

print(paste("奇數(shù)和:", odd_sum))
print(paste("偶數(shù)和:", even_sum))

### while
odd_sum <- 0
even_sum <- 0
i <- 1

while (i <= 100) {
  if (i %% 2 == 0) {
    even_sum <- even_sum + i
  } else {
    odd_sum <- odd_sum + i
  }
  i <- i + 1
}

print(paste("奇數(shù)和:", odd_sum))
print(paste("偶數(shù)和:", even_sum))

3 多重循環(huán)

以下僅記錄和提供思路,具體情況具體分析,但是有一點思維模式很得益

3.1 向量化

假設(shè)計算兩個向量x和y的點積,使用for循環(huán)分別游歷,相乘再相加:

x <- c(1, 2, 3, 4, 5)
y <- c(5, 4, 3, 2, 1)
dot_product <- 0
for (i in 1:length(x)) {
  dot_product <- dot_product + x[i] * y[i]
}
print(dot_product)

向量化,可以理解為對號入座,亮點就是sum()*

x <- c(1, 2, 3, 4, 5)
y <- c(5, 4, 3, 2, 1)
dot_product <- sum(x * y)
print(dot_product)

3.2 合并循環(huán)

假設(shè)對兩個矩陣A和B中的每個元素進(jìn)行遍歷,將它們相加,并將結(jié)果保存到矩陣C中??梢允褂脙蓚€嵌套的for循環(huán)實現(xiàn):

A <- matrix(1:9, 3, 3)
B <- matrix(10:18, 3, 3)
C <- matrix(0, 3, 3)
for (i in 1:nrow(A)) {
  for (j in 1:ncol(A)) {
    C[i, j] <- A[i, j] + B[i, j]
  }
}
print(C)

#輸出結(jié)果:
     [,1] [,2] [,3]
[1,]   11   13   15
[2,]   17   19   21
[3,]   23   25   27

但是理解這類的目的,合并循環(huán)的思路在這里剛好就是矩陣一一對應(yīng)的數(shù)字相加:

A <- matrix(1:9, 3, 3)
B <- matrix(10:18, 3, 3)
C <- A + B
print(C)

3.3 apply函數(shù)

假設(shè)有一個3x3的二維矩陣mat,需要將矩陣中每個元素求平方。我們可以使用for循環(huán)來實現(xiàn):

mat <- matrix(1:9, 3, 3)
result <- matrix(0, 3, 3)
for (i in 1:nrow(mat)) {
  for (j in 1:ncol(mat)) {
    result[i, j] <- mat[i, j] ^ 2
  }
}
print(result)

apply+function

mat <- matrix(1:9, 3, 3)
result <- apply(mat, c(1, 2), function(x) x^2)
print(result)

3.4 矩陣運算

假設(shè)需要計算一個矩陣A的逆矩陣,使用for循環(huán)和矩陣運算實現(xiàn):

A <- matrix(c(1, 2, 3, 4), 2, 2)
det_A <- A[1, 1] * A[2, 2] - A[1, 2] * A[2, 1]
adj_A <- matrix(c(A[2, 2], -A[1, 2], -A[2, 1], A[1, 1]), 2, 2)
A_inv <- adj_A / det_A
print(A_inv)

#輸出結(jié)果:
     [,1] [,2]
[1,] -2.0  1.0
[2,]  1.5 -0.5

若要優(yōu)化這一步驟,很簡單,直接用solve()

A <- matrix(c(1, 2, 3, 4), 2, 2)
A_inv <- solve(A)
print(A_inv)

3.5 foreach分解任務(wù)

foreach包實現(xiàn)多線程for循環(huán)

library(foreach)
library(doParallel)

# 創(chuàng)建一個1000行,1000列的矩陣
m <- matrix(runif(1000000), nrow = 1000)

# 初始化并行計算環(huán)境
cl <- makeCluster(detectCores())
registerDoParallel(cl)

# 使用foreach包和%dopar%運算符進(jìn)行并行計算
result <- foreach(i = 1:nrow(m), .combine = "+") %dopar% sum(m[i, ])

# 結(jié)束并行計算環(huán)境
stopCluster(cl)

# 輸出結(jié)果
print(result)

有人會說,這不就是用了個函數(shù)嗎?

是,但又不完全是,不然為何有人懂得用這個函數(shù),但有人需要一步一步算(并非說一步一步算不好,只有自己算過,理解了,才懂得去挖掘深度,化繁為簡)

4 討論

如果只知道個函數(shù)是知其然而不知其所以然,但是只知道計算過程便如優(yōu)化前的一樣,一步一步計算。得益于現(xiàn)在互聯(lián)網(wǎng)發(fā)展的飛起,各種便利工具各種開源方法,幾乎人人都是調(diào)包俠,但是當(dāng)現(xiàn)成的輔佐無法滿足時還是需要回歸底層。最近深有感觸,不論是數(shù)據(jù)挖掘、還是機(jī)器學(xué)習(xí)深度學(xué)習(xí)、人工智能、全棧,分析的盡頭就是算法。文章來源地址http://www.zghlxwxcb.cn/news/detail-459374.html

到了這里,關(guān)于R語言:鑒于計算10億以內(nèi)訓(xùn)練模型記錄for循環(huán)的加速的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包