搞數據挖掘編的神經網絡,用於分類預測。
#include <iostream> #include <fstream> #include <string> #include <cstring> #include <stack> #include <math.h> #include <vector> using namespace std; const double l=0.1;//學習率 const int trainItemNumber=20000;//訓練對的數目 typedef double** iMatrixPointer; int HIDDENLAYERNUMBER; int* HIDDENLAYERNUMBERARR; int* inputLayer; //輸入層 iMatrixPointer* weightArray; struct hiddenNode { double bias; double outputval; double err; }; hiddenNode** hiddenLayer; //隱藏層 hiddenNode* outputLayer; //輸出層 struct item { int* inputArray; int category; }; vector<item> ncItems; vector<item> changeItems; vector<item> controlItems; //通過用戶輸入獲取參數 void processInput() { //獲取隱含層層數 cout<<"請輸入隱藏層層數:"; cin>>HIDDENLAYERNUMBER; cout<<endl; weightArray = new iMatrixPointer[HIDDENLAYERNUMBER+1]; //獲取每層的結點數 HIDDENLAYERNUMBERARR = new int[HIDDENLAYERNUMBER]; for(int i=1;i<=HIDDENLAYERNUMBER;i++) { cout<<"輸入第"<<i<<"層的結點個數:"; cin>>HIDDENLAYERNUMBERARR[i-1]; cout<<endl; } } void InitializeMatrix() { int layerIndex; for(layerIndex=0;layerIndex<=HIDDENLAYERNUMBER;layerIndex++) { int currNumber,nextNumber; if(layerIndex==0) currNumber=14; else currNumber=HIDDENLAYERNUMBERARR[layerIndex-1]; if(layerIndex==HIDDENLAYERNUMBER) nextNumber=2; else nextNumber=HIDDENLAYERNUMBERARR[layerIndex]; iMatrixPointer matrix; //構造數組 matrix = new double*[currNumber]; for(int i=0;i<currNumber;i++) { matrix[i]=new double[nextNumber]; } //初始化 for(int i=0;i<currNumber;i++) for(int j=0;j<nextNumber;j++) matrix[i][j]=0.5; //給一個定值_____0.5_______ weightArray[layerIndex]=matrix; } } //初始化隱藏層 void InitializeHiddenLayer() { hiddenLayer = new hiddenNode*[HIDDENLAYERNUMBER]; for(int hLayerIndex=0;hLayerIndex<HIDDENLAYERNUMBER;hLayerIndex++) { int iLayerNodeNum = HIDDENLAYERNUMBERARR[hLayerIndex]; hiddenNode* nodeArray = new hiddenNode[iLayerNodeNum]; for(int hNodeIndex=0;hNodeIndex<iLayerNodeNum;hNodeIndex++) { nodeArray[hNodeIndex].bias = 0.5; //給一個定值_____0.5_______ nodeArray[hNodeIndex].outputval = 0; nodeArray[hNodeIndex].err=0; } hiddenLayer[hLayerIndex]=nodeArray; } } //初始化神經網絡 void InitializeModel() { InitializeMatrix(); //初始化輸入層 inputLayer = new int[14]; for(int i=0;i<14;i++) inputLayer[i]=0; //初始化隱藏層 InitializeHiddenLayer(); //初始化輸出層 outputLayer = new hiddenNode[2]; outputLayer[0].bias=0.5; //給一個定值_____0.5_______ outputLayer[0].outputval=0; outputLayer[0].err=0; outputLayer[1].bias=0.5; //給一個定值_____0.5_______ outputLayer[1].outputval=0; outputLayer[1].err=0; } void forwardInput(int inputArray[]) { //處理輸入層 for(int i=0;i<14;i++) { inputLayer[i]=inputArray[i]; } //處理隱藏層 for(int mi=0;mi<HIDDENLAYERNUMBER;mi++) { int currNum=HIDDENLAYERNUMBERARR[mi];//當前層結點個數 if(mi==0) { //第一層隱藏層 for(int nindex=0;nindex<currNum;nindex++) { //對於第一隱藏層每個結點進行計算 iMatrixPointer inputMatrix=weightArray[0];//輸入--第一隱藏層權重數組 double sum=0; for(int findex=0;findex<14;findex++) { //取輸入層結點累加 sum+=(double)inputLayer[findex]*inputMatrix[findex][nindex]; } hiddenLayer[0][nindex].outputval=sum;//記錄輸出值 } } else { iMatrixPointer prev_currMatrix=weightArray[mi]; int prevNodeNum=HIDDENLAYERNUMBERARR[mi-1]; for(int curindex=0;curindex<currNum;curindex++) { //對於當前每個結點進行計算 double sum=0; for(int previndex=0;previndex<prevNodeNum;previndex++) { double prevNWeight=prev_currMatrix[previndex][curindex]; double prevNOutput=hiddenLayer[mi-1][previndex].outputval; sum+=prevNWeight*prevNOutput; } //加上當前結點的偏倚值 sum+=hiddenLayer[mi][curindex].bias; //激勵函數 double output=1/(1+exp(-sum)); //保存輸出 hiddenLayer[mi][curindex].outputval=output; } }//else }//for //處理輸出層 int lastHiddenNumber=HIDDENLAYERNUMBERARR[HIDDENLAYERNUMBER-1]; iMatrixPointer prev_currMatrix=weightArray[HIDDENLAYERNUMBER]; for(int curindex=0;curindex<2;curindex++) { double sum=0; for(int previndex=0;previndex<lastHiddenNumber;previndex++) { double prevNWeight=prev_currMatrix[previndex][curindex]; double prevNOutput=hiddenLayer[HIDDENLAYERNUMBER-1][previndex].outputval; sum+=prevNWeight*prevNOutput; } sum+=outputLayer[curindex].bias; double output=1/(1+exp(-sum)); outputLayer[curindex].outputval=output; } } void trainOneItem(int inputArray[],int category) { //向前傳播輸入 forwardInput(inputArray); //後向傳播誤差 double err; //輸出層 double bit[2]; switch(category) { case 2: bit[0]=1; bit[1]=0; break; case 1: bit[0]=0; bit[1]=1; break; case 0: bit[0]=0; bit[1]=0; break; } for(int oindex=0;oindex<2;oindex++) { double output=outputLayer[oindex].outputval; double cbit=bit[oindex]; err=output*(1-output)*(cbit-output); outputLayer[oindex].err=err; } //計算隱藏層誤差 for(int hindex=HIDDENLAYERNUMBER-1;hindex>=0;hindex--) { int nodeNumber=HIDDENLAYERNUMBERARR[hindex]; for(int nindex=0;nindex<nodeNumber;nindex++) { double curNodeOut=hiddenLayer[hindex][nindex].outputval;//取當前結點的輸出 double errsum=0;//後節點的誤差權重積的和 if(hindex==HIDDENLAYERNUMBER-1)//最後一層隱藏層 { //取輸出層信息 for(int oindex=0;oindex<2;oindex++) { double oerr=outputLayer[oindex].err; iMatrixPointer omatrix=weightArray[HIDDENLAYERNUMBER]; double oweight=omatrix[nindex][oindex]; errsum+=oerr*oweight; } } else { //取下一層信息 iMatrixPointer cur_nextMatrix=weightArray[hindex+1]; int nextLayerNodeNum=HIDDENLAYERNUMBERARR[hindex+1]; for(int nextindex=0;nextindex<nextLayerNodeNum;nextindex++) { double nerr=hiddenLayer[hindex+1][nextindex].err; double nweight=cur_nextMatrix[nindex][nextindex]; errsum+=nerr*nweight; } } double curerr=curNodeOut*(1-curNodeOut)*errsum; hiddenLayer[hindex][nindex].err=curerr; }//for }//for //更新權重 for(int lindex=HIDDENLAYERNUMBER;lindex>=0;lindex--) { iMatrixPointer matrix=weightArray[lindex]; int curNum,nextNum; if(lindex==HIDDENLAYERNUMBER)//隱藏層最後一層 { nextNum=2; curNum=HIDDENLAYERNUMBERARR[HIDDENLAYERNUMBER-1]; for(int ci=0;ci<curNum;ci++) { for(int ni=0;ni<nextNum;ni++) { double nerr=outputLayer[ni].err; double coutput=hiddenLayer[HIDDENLAYERNUMBER-1][ci].outputval; double deltaw=l*nerr*coutput; matrix[ci][ni]+=deltaw; } } } else if(lindex==0)//輸入層 { curNum=14; nextNum=HIDDENLAYERNUMBERARR[0]; for(int ci=0;ci<curNum;ci++) { for(int ni=0;ni<nextNum;ni++) { double nerr=hiddenLayer[0][ni].err; double coutput=inputLayer[ci]; double deltaw=l*nerr*coutput; matrix[ci][ni]+=deltaw; } } } else { curNum=HIDDENLAYERNUMBERARR[lindex-1]; nextNum=HIDDENLAYERNUMBERARR[lindex]; for(int ci=0;ci<curNum;ci++) { for(int ni=0;ni<nextNum;ni++) { double nerr=hiddenLayer[lindex][ni].err; double coutput=hiddenLayer[lindex-1][ci].outputval; double deltaw=l*nerr*coutput; matrix[ci][ni]+=deltaw; } } } } //更新偏倚 for(int lindex=HIDDENLAYERNUMBER+1;lindex>=1;lindex--) { if(lindex==HIDDENLAYERNUMBER+1)//輸出層 { for(int i=0;i<2;i++) { double delta=l*outputLayer[i].err; outputLayer[i].bias+=delta; } } else { int number=HIDDENLAYERNUMBERARR[lindex-1]; for(int i=0;i<number;i++) { double delta=l*hiddenLayer[lindex-1][i].err; hiddenLayer[lindex-1][i].bias+=delta; } } } } void training() { //讀文件 ifstream fin("TrainForm.txt"); if(!fin.is_open()) { cerr<<"打開文件錯誤"<<endl; exit(0); } char buf[80]; fin.getline(buf,80); char* token="/t"; while(fin.getline(buf,80)) { int index=0; int lineInput[14]; int lineIndex=0; char* result = strtok(buf,token); int category; while(result!=NULL) { index++; if(index==5) { if(strcmp(result,"nc")==0) category=0; else if(strcmp(result,"control")==0) category=1; else if(strcmp(result,"change")==0) category=2; } if(index!=1&&index!=5) { int num=atoi(result); //十進制轉成二進制 stack<int> s; while(num!=0) { s.push(num%2); num/=2; } if(index==2||index==4) { if(s.size()!=5) { int vac=5-s.size(); for(int i=0;i<vac;i++) s.push(0); } } else if(index==3) { if(s.size()!=4) { int vac=4-s.size(); for(int i=0;i<vac;i++) s.push(0); } } while(!s.empty()) { lineInput[lineIndex]=s.top(); s.pop(); lineIndex++; } } result=strtok(NULL,token); }//while item i; i.inputArray=new int[14]; i.inputArray=lineInput; i.category=category; if(category==0) ncItems.push_back(i); else if(category==1) controlItems.push_back(i); else if(category==2) changeItems.push_back(i); //trainOneItem(lineInput,category); fin.getline(buf,80); }//while for(int i=0;i<trainItemNumber;i++) { //從nc,control,change中各取一條進行訓練 int ncNumber,changeNumber,controlNumber,ncIndex,changeIndex,controlIndex; ncNumber=ncItems.size(); changeNumber=changeItems.size(); controlNumber=controlItems.size(); ncIndex=rand()%ncNumber; changeIndex=rand()%changeNumber; controlIndex=rand()%controlNumber; item ncit=ncItems.at(ncIndex); item controlit=controlItems.at(controlIndex); item changeit =changeItems.at(changeIndex); trainOneItem(ncit.inputArray,ncit.category); trainOneItem(changeit.inputArray,changeit.category); trainOneItem(controlit.inputArray,controlit.category); } } void forecastOneItem(int inputArr[]) { forwardInput(inputArr); cout<<outputLayer[0].outputval<<":"<<outputLayer[1].outputval<<endl; } int main() { processInput(); InitializeModel(); training(); int arr1[]={00101010000100};//change forecastOneItem(arr1); int arr2[]={00101100100011};//nc forecastOneItem(arr2); int arr3[]={00001100100011};//control forecastOneItem(arr3); return 0; }
本文分享自華爲雲社區《從原始邊列表到鄰接矩陣Python實現圖數據處理的完整指南》,作者: 檸檬味擁抱。 在圖論和網絡分析中,圖是一種非常重要的數據結構,它由節點(或頂點)和連接這些節點的邊組成。在Python中,我們可以使用鄰接矩陣來表示
本文大約1.7萬字,閱讀需要13分鐘。 導讀:近幾年,除AIGC外,軟件領域相關比較大的變化,就是各相關業務領域開始如火如荼地建設中臺和去中臺化了。本文不探討中臺對公司組織架構涉及的變化和影響,只是從中臺化演進的思路,及使用的底層支撐技
一、前言 用ffmpeg做音視頻保存到mp4文件,都會遇到一個問題,尤其是在視頻監控行業,就是監控攝像頭設置的音頻是PCM/G711A/G711U,解碼後對應的格式是pcm_s16be/pcm_alaw/pcm_mulaw,將這個原始的音頻
本文分享自華爲雲社區《【技術分享】什麼是Token?爲什麼GPT基於Token定價》,作者:開天aPaaS小助手Tracy。 在使用LLM大模型時,我們經常會遇到一個關鍵詞,叫:Token。 比如: 最新版 GPT-4 Turbo 模型最高
近年來,向量搜索領域經歷了爆炸性增長,尤其是在大型語言模型(LLMs)問世後。學術界開始重點關注如何通過擴展訓練數據、採用先進的訓練方法和新的架構等方法來增強 embedding 向量模型。 在之前的文章中,我們已經深入探討了各種類型的 e
前端: import ClientMonitor from 'skywalking-client-js'; ClientMonitor.setPerformance({ collector: 'http://127.0.0.
1.比如這是一個完整的token:getstorelistbyxy:channelcodemini_program 我想通過搜索getstorelistbyxy搜索到這個token該怎麼寫 通配符查詢-前綴匹配加* getstorelist
一、架構圖**** 二、Nginx**** 用於做服務的反向代理。 三、網關**** PaaS平臺所有服務統一入口,包含token鑑權功能。 四、開放平臺**** 對第三方平臺開放的服務入口。 五、MQTT**** MQTT用於設備消息通
2. 構建一個優秀的Prompt 在使用Stable Diffusion AI時,構建一個有效的提示(Prompt)是至關重要的第一步。這個過程涉及到創造性的嘗試和對AI行爲的理解。這裏我會對如何構建一個好的Prompt進行一個總結。 什麼
你還沒嘗試過 AI 視頻生成?AI 技術逐漸浸透我們的生活,太多的事物變得有了捷徑可走。AI 視頻生成爲創作者們提供更加便利快捷的輸出形式,更優質更契合的生產內容。嘗試 AI 視頻生成系列應用,迎接 AI 宇宙! 生成劇本分鏡 視頻創作,
作者:鈺誠 簡介 基於 wasm 機制,Higress 提供了優秀的可擴展性,用戶可以基於 Go/C++/Rust 編寫 wasm 插件,自定義請求處理邏輯,滿足用戶的個性化需求,目前插件已經支持 redis 調用,使得用戶能夠編寫有狀態的
在前面的課程中,我在 JavaScript 和 CSS 的部分,多次提到了編譯原理相關的知識。這一部分的知識,如果我們從編譯原理“龍書”等正規的資料中學習,就會耗費掉不少的時間,所以我在這裏設計了一個小實驗,幫助你快速理解編譯原理相關的知識
skywalking-client-js會發起2個請求到服務端這兩個是沒有加簽的,拿到curl會發請求。 /skywalking/v3/segments skywalking/browser/perfData 官方的提供的是一個固定to
爲了助力更多的創作者實現在飛槳星河社區的成長,同時鼓勵創作者們積極投入,記錄創作者們的高光時刻,重磅推出「創作者成長體系」,同時推出「每週精選 &月度榜單」活動,期待你一同加入精彩紛呈的 AI 學習與創作之旅,與社區千萬開發者一起共建、共創
2024年3月4日,官方宣佈推出 Claude 3 模型系列,它在廣泛的認知任務中樹立了新的行業基準。該系列包括三個按能力遞增排序的最先進模型:Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus。