蘇州培訓(xùn)網(wǎng) > 蘇州JAVA培訓(xùn)機(jī)構(gòu) > 蘇州其然軟件開發(fā)培訓(xùn)
首頁 培訓(xùn)網(wǎng) 最新資訊 熱門問答

蘇州其然軟件開發(fā)培訓(xùn)

13013833891 免費(fèi)試聽

您當(dāng)前的位置: 蘇州IT認(rèn)證培訓(xùn) > 蘇州JAVA培訓(xùn) > 常熟java開發(fā)培訓(xùn)費(fèi)用

常熟java開發(fā)培訓(xùn)費(fèi)用_JAVA培訓(xùn)

¥詳詢

班制:周末班

蘇州其然軟件開發(fā)
上課(咨詢)地址:蘇州市昆山市震川西路111號名仕大廈
報(bào)名咨詢 預(yù)約試聽
課程介紹
常熟java開發(fā)培訓(xùn)費(fèi)用
其然IT 教育師資

黃 凱高級講師

多年移動互聯(lián)網(wǎng)開發(fā)經(jīng)驗(yàn),精通Android與iOS開發(fā),對JavaEE等后臺技術(shù)也 有所研究。尤其精通Android平臺的開發(fā),對Android平臺下的性能優(yōu)化有極其豐富的經(jīng)驗(yàn)。 曾就職于酷狗音樂擔(dān)任高級Android軟件工程師與Team Leader一職,帶領(lǐng)超過20人的開發(fā)團(tuán)隊(duì),有豐富的開發(fā)與管理經(jīng)驗(yàn)。參與開發(fā)了<酷狗音樂>,<繁星網(wǎng)>,<中國電信移動辦公>, <智慧天河>,<翼健康>,<創(chuàng)餉無限>,<外修管家>等20多款互聯(lián)網(wǎng)熱門應(yīng)用。其不但開發(fā)經(jīng)驗(yàn)豐富,教學(xué)幽默風(fēng)趣,而且對 學(xué)生要求嚴(yán)格,堅(jiān)持授人與魚不如授人與漁的理念,注重培養(yǎng)學(xué)生的解決問題與自我思考的能力。

常熟java開發(fā)培訓(xùn)費(fèi)用

java入門要注意什么

常熟java開發(fā)培訓(xùn)費(fèi)用

學(xué)習(xí)java就像是一個(gè)種花的過程,不斷地為其施肥澆水,它才會茁壯成長。 而我們學(xué)習(xí)java,就要不斷的充實(shí)自己、提升自己,才能獲得更多機(jī)會。很多開始學(xué)習(xí)java編程的小白,經(jīng)常就會被概念、定義什么的搞糊涂。當(dāng)分類 、對象、接口、構(gòu)造函數(shù)等等各種專業(yè)名詞出現(xiàn)的時(shí)候,你一定是腦子里好像一片空白,根本就搞不懂這些字眼的意思和關(guān)系,而且,這種情況下,很 容易導(dǎo)致你喪失自信心,開始逃避、拒絕,這些小白經(jīng)常遇到的情況在我剛接觸java的時(shí)候也遇見了,但是好在我足夠幸運(yùn),遇見了誠筑說。我現(xiàn)在已 經(jīng)是公司的項(xiàng)目經(jīng)理了,今天,我為大家來總結(jié)了一些經(jīng)驗(yàn)和建議,希望能夠幫助到大家。

一點(diǎn):熟練基本的j2seAPI

除去java語言本身的語法之外呢,要懂得并且熟練j2seAPI的API也是非常有 必要的,在這里,就建議大家首先去掌握字符串的處理、異常的處理、容器、輸入輸出、線程等,這些相對來說較為重要的。還有就是API的內(nèi)容是非 常龐大的,關(guān)于API,一定要懂得查詢API的文件說明,在了解了其作用用途或者目的才能夠進(jìn)行相對于的程序。

二點(diǎn):穩(wěn)固java的語法基礎(chǔ)

學(xué)習(xí)java一定要學(xué)會使用java的程序語言,用來編寫程序,但是學(xué)習(xí)程序語 言就要熟悉語法是怎么使用的。程序語言其實(shí)也是一種語言,不過跟人類的語言不同,這種語言是要和計(jì)算機(jī)溝通交流,那怎么做才能熟悉這種語言呢 ,我給出的建議是多看別人寫的程序,了解人家是怎么用java來解決問題的。然后再找類似的程序去練習(xí)了,這樣就能夠從實(shí)際操作中檢驗(yàn)自己是否真 的知道該怎么去解決問題了。

三點(diǎn):加入貼吧論壇多參與討論

根據(jù)我當(dāng)時(shí)的經(jīng)驗(yàn),在大家學(xué)習(xí)的過程中,如果有人可以參與話題,共同討 論的話,會加快你學(xué)習(xí)的速度。所以大家可以和我一樣,找一個(gè)技術(shù)討論的地方,貼吧啊,論壇啊都可以,在這里進(jìn)行討論,畢竟大家有著共同的目標(biāo) 和理想,有著共同的話題可聊,這樣的話,又大大節(jié)省了學(xué)習(xí)的時(shí)間。

學(xué)完基本的java語法呢,現(xiàn)在就該用java來進(jìn)行實(shí)際的編程了,假如你需要 編寫窗口程序,那就學(xué)Swing窗口設(shè)計(jì);假如你要編寫數(shù)據(jù)庫什么的,那就學(xué)JDBC等等。

互聯(lián)網(wǎng)類項(xiàng)目 項(xiàng)目一:CRM客戶管理系統(tǒng) 

常熟java開發(fā)培訓(xùn)費(fèi)用

互聯(lián)網(wǎng)類項(xiàng)目 項(xiàng)目一:CRM客戶管理系統(tǒng)

項(xiàng)目簡介

CRM項(xiàng)目主要是管理企業(yè)與客戶之間的關(guān)系。該項(xiàng)目主要實(shí)現(xiàn)功能:營銷管 理、客戶管理、服務(wù)管理、統(tǒng)計(jì)報(bào)表、基礎(chǔ)數(shù)據(jù)、權(quán)限管理等。

技術(shù)特點(diǎn)

項(xiàng)目備戰(zhàn)(git、Maven、shiro)、Struts2(表現(xiàn)層MVC框架)、 Hibernate(數(shù)據(jù)層持久化框架)、Spring(業(yè)務(wù)邏輯IoC和AOP框架)、JBPM(工作流支持)、Junit(單元測試)、Jquery(JS框架)。

學(xué)習(xí)效果

**項(xiàng)目使學(xué)員熟悉軟件開發(fā)的整個(gè)流程(需求分析、設(shè)計(jì)、編碼、測試以 及部署與維護(hù));提升框架整合能力;成為具備一定的項(xiàng)目管理和架構(gòu)設(shè)計(jì)能力的中高級Java工程師。

Graphx源碼解析之SVD 算法


>

Spark Graphx中SVD 算法主要是參考論文: http://public.research.att.com/~volinsky/netflix/kdd08koren.pdf, 核心計(jì)算公式為:rui = u bu bi qi*(pu |N(u)|^^-0.5^^*sum(y)) 輸入 輸入:user,item,score

1,1,5.0 1,2,1.0 1,3,5.0 1,4,1.0 2,1,5.0 2,2,1.0 2,3,5.0 2,4,1.0 3,1,1.0 3,2,5.0 3,3,1.0 3,4,5.0 4,1,1.0 4,2,5.0 4,3,1.0 4,4,5.0

根據(jù)需要,圖主要分為有向圖與無向圖兩種。由于起點(diǎn)與終點(diǎn)代表著不同的含義,選擇有向圖作為研究的主體。為了便于區(qū)分起點(diǎn)與終點(diǎn),在數(shù)據(jù)錄入之前起點(diǎn)ID乘2,終點(diǎn)ID乘2加1

Edge(uid.toString.toLong * 2, live_uid.toString.toLong * 2 1,score.toString.toDouble)

參數(shù)

class Conf( var rank: Int,//向量維數(shù) var maxIters: Int,//迭代次數(shù) var minVal: Double,//**小值 var maxVal: Double,//**大值 var gamma1: Double,//衰減系數(shù) var gamma2: Double,//衰減系數(shù) var gamma6: Double,//衰減系數(shù) var gamma7: Double)//衰減系數(shù) extends Serializable

算法輸入 輸出

run(edges: RDD[Edge[Double]], conf: Conf) : (Graph[(Array[Double], Array[Double], Double, Double), Double], Double)

計(jì)算平均評分

//rs 評分之和 //rc 記錄總數(shù) val (rs, rc) = edges.map(e => (e.attr, 1L)).reduce((a, b) => (a._1 b._1, a._2 b._2)) //平均評分 val u = rs / rc

組成圖

Graph.fromEdges(edges, defaultF(conf.rank)).cache()

defaultF根據(jù)rank值隨機(jī)生成feature向量,看下defaultF方法

def defaultF(rank: Int): (Array[Double], Array[Double], Double, Double) = { // TODO: use a fixed random seed val v1 = Array.fill(rank)(Random.nextDouble()) val v2 = Array.fill(rank)(Random.nextDouble()) (v1, v2, 0.0, 0.0) }

計(jì)算SUM和根號值

//頂點(diǎn) 頂點(diǎn)出現(xiàn)的次數(shù) 評分總和 val t0: VertexRDD[(VertexId, Double)] = g.aggregateMessages[(VertexId, Double)](ctx => { ctx.sendToSrc((1L, ctx.attr)); ctx.sendToDst((1L, ctx.attr)) }, (g1, g2) => (g1._1 g2._1, g1._2 g2._2)) // t0.foreach(PRintln(_)) // 總評分除以總次數(shù)減去平均評分 1 / 總次數(shù)的開根號 val gJoinT0 = g.outerJoinVertices(t0) { (vid: VertexId, vd: (Array[Double], Array[Double], Double, Double), msg: Option[(Long, Double)]) => // println(msg.get._2 " " msg.get._1) (vd._1, vd._2, msg.get._2 / msg.get._1 - u, 1.0 / scala.math.sqrt(msg.get._1)) }.cache()

此時(shí)的輸出結(jié)果為g:

id p q bu/bi |N(u)|^^-0.5 (4,([D@7ed9bdff,[D@15188d22,0.0,0.5)) (6,([D@7ed9bdff,[D@15188d22,0.0,0.5)) (3,([D@7ed9bdff,[D@15188d22,0.0,0.5)) (7,([D@7ed9bdff,[D@15188d22,0.0,0.5)) (9,([D@7ed9bdff,[D@15188d22,0.0,0.5)) (8,([D@7ed9bdff,[D@15188d22,0.0,0.5)) (5,([D@7ed9bdff,[D@15188d22,0.0,0.5)) (2,([D@7ed9bdff,[D@15188d22,0.0,0.5))

將g作為輸入,進(jìn)行迭代 **步 所有起點(diǎn)的第二個(gè)數(shù)組根據(jù)起點(diǎn)求MR并合并到g中

//起始點(diǎn) 相加 次數(shù) 起始點(diǎn)個(gè)數(shù) 第二個(gè)數(shù)組 val t1 = g.aggregateMessages[Array[Double]]( ctx => { // println(ctx); ctx.sendToSrc(ctx.dstAttr._2) }, (g1, g2) => { // println(g1.toList) // println(g2.toList) val out = g1.clone() blas.daxpy(out.length, 1.0, g2, 1, out, 1) out }) // t1.foreach(x => println(x._1 " " x._2.toList)) val gJoinT1 = g.outerJoinVertices(t1) { (vid: VertexId, vd: (Array[Double], Array[Double], Double, Double), msg: Option[Array[Double]]) => if (msg.isDefined) { val out = vd._1.clone() blas.daxpy(out.length, vd._4, msg.get, 1, out, 1) (vd._1, out, vd._3, vd._4) } else { vd } }.cache()

注意:blas.daxpy 是矩陣相加,由第三方j(luò)ar提供

第二步

// Phase 2, update p for user nodes and q, y for item nodes g.cache() val t2 = g.aggregateMessages( sendMsgTrainF(conf, u), (g1: (Array[Double], Array[Double], Double), g2: (Array[Double], Array[Double], Double)) => { val out1 = g1._1.clone() blas.daxpy(out1.length, 1.0, g2._1, 1, out1, 1) val out2 = g2._2.clone() blas.daxpy(out2.length, 1.0, g2._2, 1, out2, 1) (out1, out2, g1._3 g2._3) }) // t2.foreach(x => println(x)) val gJoinT2 = g.outerJoinVertices(t2) { (vid: VertexId, vd: (Array[Double], Array[Double], Double, Double), msg: Option[(Array[Double], Array[Double], Double)]) => { val out1 = vd._1.clone() blas.daxpy(out1.length, 1.0, msg.get._1, 1, out1, 1) val out2 = vd._2.clone() blas.daxpy(out2.length, 1.0, msg.get._2, 1, out2, 1) (out1, out2, vd._3 msg.get._3, vd._4) } }.cache()

重點(diǎn)介紹sendMsgTrainF

def sendMsgTrainF(conf: Conf, u: Double) (ctx: EdgeContext[ (Array[Double], Array[Double], Double, Double), Double, (Array[Double], Array[Double], Double)]) { val (usr, itm) = (ctx.srcAttr, ctx.dstAttr) println(usr._3 " " usr._4) val (p, q) = (usr._1, itm._1) val rank = p.length var pred = u usr._3 itm._3 blas.ddot(rank, q, 1, usr._2, 1) // println("srcId: " ctx.srcId " dstId: " ctx.dstId " attr: " ctx.attr " pred: " pred " error: " (ctx.attr - pred)) // println("sendMsgTrainF pred " pred) pred = math.max(pred, conf.minVal) pred = math.min(pred, conf.maxVal) val err = ctx.attr - pred // println("sendMsgTrainF err " err) // updateP = (err * q - conf.gamma7 * p) * conf.gamma2 val updateP = q.clone() blas.dscal(rank, err * conf.gamma2, updateP, 1) blas.daxpy(rank, -conf.gamma7 * conf.gamma2, p, 1, updateP, 1) // updateQ = (err * usr._2 - conf.gamma7 * q) * conf.gamma2 val updateQ = usr._2.clone() // println("begin srcId: " ctx.srcId " dstId: " ctx.dstId " " updateQ.toList) blas.dscal(rank, err * conf.gamma2, updateQ, 1) // println("dscal: " updateQ.toList " " err * conf.gamma2) blas.daxpy(rank, -conf.gamma7 * conf.gamma2, q, 1, updateQ, 1) // println("daxpy: " updateQ.toList " " (-conf.gamma7 * conf.gamma2)) // updateY = (err * usr._4 * q - conf.gamma7 * itm._2) * conf.gamma2 val updateY = q.clone() blas.dscal(rank, err * usr._4 * conf.gamma2, updateY, 1) blas.daxpy(rank, -conf.gamma7 * conf.gamma2, itm._2, 1, updateY, 1) ctx.sendToSrc((updateP, updateY, (err - conf.gamma6 * usr._3) * conf.gamma1)) ctx.sendToDst((updateQ, updateY, (err - conf.gamma6 * itm._3) * conf.gamma1)) }

pred為迭代一次的評分,err為誤差。 updateP = (err * q - conf.gamma7 * p) * conf.gamma2 updateQ = (err * usr._2 - conf.gamma7 * q) * conf.gamma2 updateY = (err * usr._4 * q - conf.gamma7 * itm._2) * conf.gamma2 起點(diǎn)修改為(updateP, updateY, score) 終點(diǎn)修改為(updateQ, updateY, score) 然后分布將解決更新到g中對應(yīng)頂點(diǎn)的前三個(gè)位置。 可以很明顯的發(fā)現(xiàn)這里才有的是每個(gè)頂點(diǎn)下降**后sum隨機(jī)梯度下降的方式迭代。

M 1.per = u user.3 item.3 item1*user2 2.per **大**小閉區(qū)間 [min, max] 范圍約束 3.誤差 err = 真實(shí)評分 - per 4.user (err * gamma2 * item1 - gamma7 * gamma2 * user1, err * user4 * gamma2 * item1 - gamma7 * gamma2 * item2, (err - gamma6 * user3) * gamma1) item (err * gamma2 * user2 - gamma7 * gamma2 * user1, err * user4 * gamma2 * item1 - gamma7 * gamma2 * item2, (err - gamma6 * item3) * gamma1)

循環(huán)上述迭代過程

評測

val t3 = g.aggregateMessages[Double](sendMsgTestF(conf, u), _ _) val gJoinT3 = g.outerJoinVertices(t3) { (vid: VertexId, vd: (Array[Double], Array[Double], Double, Double), msg: Option[Double]) => if (msg.isDefined) (vd._1, vd._2, vd._3, msg.get) else vd }.cache()

第三步 獲取err

val t3 = gJoinT2.aggregateMessages[Double](sendMsgTestF(conf, u), _ _) val gJoinT3 = gJoinT2.outerJoinVertices(t3) { (vid: VertexId, vd: (Array[Double], Array[Double], Double, Double), msg: Option[Double]) => if (msg.isDefined) (vd._1, vd._2, vd._3, msg.get) else vd }.cache() val err = gJoinT3.vertices.map { case (vid, vd) => if (vid % 2 == 1) vd._4 else 0.0 }.reduce(_ _) / gJoinT3.numEdges RedisUtil.setIntoRedis(i "_ERR", err.toString)

如果發(fā)現(xiàn)每次迭代過程中err的值出現(xiàn)波動,則可以將gamma1,gamma2調(diào)小,再次進(jìn)行迭代試驗(yàn)。err走向圖如下:

user中的user1為隱性feature,item中的item1為隱性feature。 結(jié)果輸出

val labels = g.triplets.map { ctx => val (usr, itm) = (ctx.srcAttr, ctx.dstAttr) val (p, q) = (usr._1, itm._1) var pred = u usr._3 itm._3 blas.ddot(q.length, q, 1, usr._2, 1) pred = math.max(pred, conf.minVal) pred = math.min(pred, conf.maxVal) val err = (ctx.attr - pred) } (ctx.srcId / 2) "|" (ctx.dstId - 1) / 2 "|" pred }.saveAsTextFile("/spark/grxpah/svd")

后面可以進(jìn)行類AUC之類的效果評測


相關(guān)推薦:


蘇州JAVA培訓(xùn)   蘇州JAVA培訓(xùn)班   蘇州JAVA培訓(xùn)機(jī)構(gòu)

體驗(yàn)課預(yù)約試聽

倒計(jì)時(shí)

12:00:00

課程熱線:

13013833891
在線咨詢

客服在線時(shí)間:早上9點(diǎn)~下午6點(diǎn),其他時(shí)間請?jiān)诰€預(yù)約報(bào)名或留言,謝謝!

蘇州JAVA

免費(fèi)體驗(yàn)課開班倒計(jì)時(shí)

11: 41: 09

稍后會有專業(yè)老師給您回電,請保持電話暢通

咨詢電話:13013833891
推薦機(jī)構(gòu) 全國分站 更多課程

本周僅剩 個(gè)試聽名額

請鍵入信息,稍后系統(tǒng)將會把領(lǐng)獎短信發(fā)至您的手機(jī)

申請?jiān)嚶犆~

QQ:1413838287
加盟合作:0755-83654572