日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

感知机算法的两种表示

發布時間:2025/5/22 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 感知机算法的两种表示 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

感知機算法的原始形式

輸入:訓練數據集T={(x1,y1),(x2,y2),...,(xn,yn)},其中xi屬于Rn(n維空間向量),yi={-1,+1},i=1,2,...,N

學習率t(0<t<=1);

輸出:w,b;感知機模型f(x)=sign(w*x+b)

(1)選取初值w0,b0一般為 0

(2)在訓練集中選取數據(xi,yi)

(3)如果yi(w*xi+b)<=0

? ? ? ? ? ? ? ? ? ? ? ? ? w<---w+tyixi

? ? ? ? ? ? ? ? ? ? ? ? ?? b<----b+tyi

(4)轉至(2),直至訓練集中沒有誤分類點。

算法代碼如下

1 import java.util.Random; 2 import java.util.Scanner; 3 import java.util.regex.Matcher; 4 import java.util.regex.Pattern; 5 6 //初始的感知機學習算法 7 public class ganzhijiOriginal { 8 // 數據集中數據的個數 9 public static int NCount; 10 // 數據中每個數值的維數 不包含y 11 public static int N; 12 // 學習率 (0,1] 13 public static float t; 14 15 // 保存數據 16 public static int datas[][]; 17 // 權重向量 18 public static float w[]; 19 // 偏移數據 20 public static float b; 21 22 public static void main(String args[]) { 23 Scanner sca = new Scanner(System.in); 24 // 默認輸入的格式為 N-t-b 25 System.out.println("輸入格式為N-t-b-NCount的數據:"); 26 String lines = sca.nextLine(); 27 Pattern pattern = Pattern.compile("(.*)-(.*)-(.*)-(.*)"); 28 Matcher matcher = pattern.matcher(lines); 29 matcher.find(); 30 N = Integer.parseInt(matcher.group(1)); 31 t = Float.parseFloat(matcher.group(2)); 32 b = Float.parseFloat(matcher.group(3)); 33 // b = Integer.parseInt(matcher.group(3)); 34 NCount = Integer.parseInt(matcher.group(4)); 35 // System.out.println("請輸入權重向量的初始值格式為格式為x,x,x,x" + N); 36 //初始化數據集 37 w = new float[N]; 38 // lines = sca.nextLine(); 39 // String[] str = lines.split(","); 40 // for (int i = 0; i < N; i++) 41 // w[i] = Float.parseFloat(str[i]); 42 datas = new int[NCount][N + 1]; 43 System.out.println("請輸入所有權重向量的初始值"); 44 for (int i = 0; i < NCount; i++) { 45 String line = sca.nextLine(); 46 String strs[] = line.split(" "); 47 for (int j = 0; j <= N; j++) 48 datas[i][j] = Integer.parseInt(strs[j]); 49 } 50 CountTheTimes = 0; 51 Random ra = new Random(); 52 int chooseNumber = ra.nextInt(NCount); 53 CalcuteAndUpdatValue(0); 54 String strd = ""; 55 for (int i = 0; i < N; i++) 56 strd += w[i] + "*x" + i + "+ "; 57 System.out.println("F(x)=sign(" + strd + b + ")"); 58 } 59 60 public static int CountTheTimes; 61 62 private static void CalcuteAndUpdatValue(int chooseNumber) { 63 float f = isPOrN(chooseNumber); 64 boolean flages = f * datas[chooseNumber][N] > 0 ? true : false; 65 if (!flages) { 66 for (int j = 0; j < N; j++) //更新權重w的值 67 w[j] = w[j] + t * datas[chooseNumber][N] * datas[chooseNumber][j]; 68 b = b + t * datas[chooseNumber][N]; 69 70 CountTheTimes = 0;//初始化 71 } else { 72 CountTheTimes++; 73 chooseNumber = (chooseNumber + 1) % NCount; 74 } 75 if (CountTheTimes == NCount) return; 76 CalcuteAndUpdatValue(chooseNumber); 77 } 78 79 private static float isPOrN(int chooseNumber) { 80 float sum = 0; 81 for (int i = 0; i < N; i++) sum += datas[chooseNumber][i] * w[i]; 82 return sum + b; 83 } 84 85 } View Code

?

感知機算法的對偶形式

輸入:線性可分的數據集T={(x1,y1),(x2,y2),...,(xn,yn)}其中xi屬于Rn(n維向量),yi屬于{-1,+1},i,2,。。。,N;學習率為t (0<t<=1)

輸出a,b 感知機模型f(x)=sign(j從1 到 ajyjxj*x累加? +b) 其中a=(a1,a2,a3...,an)T

(1)a<---0,b<----0

(2)在訓練數據集中選擇(xi,yi)

(3)如果 yi(j從1 到 ajyjxj*xi累加? +b)<=0

? ? ? ? ? ? ? ? ? ai<----ai+t

? ? ? ? ? ? ? ?? b<---b+tyi

(4)轉至(2)直到沒有誤分類點

算法如下

?

import java.util.Random; import java.util.Scanner;//感知機算法的對偶形式 public class ganzhijiOudui {//存儲數據的Gram矩陣public static int gramMatrix[][];// 存儲初始點集合包括ypublic static int datas[][];//感知機中的學習率(0,1]public static float t;// 存儲某個點更新的次數ntpublic static float a[];// 點的維度 不包含ypublic static int N;// 總點的數public static int NCount;//偏移量public static float b;public static int w[];//權重public static void main(String args[]) {Scanner sca = new Scanner(System.in);System.out.println("輸入的格式為:N-t-b-NCount");String line = sca.nextLine();String dt[] = line.split("-");N = Integer.parseInt(dt[0]);t = Float.parseFloat(dt[1]);b = Float.parseFloat(dt[2]);NCount = Integer.parseInt(dt[3]);InitDatas(sca);}private static void InitDatas(Scanner sca) {datas = new int[NCount][N + 1];gramMatrix = new int[NCount][NCount];w = new int[N]; // 默認值為零a = new float[NCount];System.out.println("輸入數據點集合格式為x x x ... Y");for (int i = 0; i < NCount; i++) {String line = sca.nextLine();String strs[] = line.split(" ");for (int j = 0; j <= N; j++) datas[i][j] = Integer.parseInt(strs[j]);}System.out.println("初始化Gram矩陣");for (int i = 0; i < NCount; i++) {for (int j = 0; j < NCount; j++) {gramMatrix[i][j] = MultiplyTheDatas(i, j);}} // 記錄總的循環次數TotalTimes = 0;Random random = new Random();int chooseNumber = random.nextInt(NCount);CalculateAndUpdatDatas(0);//更新 wfor (int i = 0; i < N; i++) {int sum = 0;for (int j = 0; j < NCount; j++) sum += a[j] * datas[j][i]*datas[j][N];w[i] = sum;}String strd = "";for (int i = 0; i < N; i++)strd += w[i] + "*x" + i + "+ ";System.out.println("F(x)=sign(" + strd + b + ")");}public static int TotalTimes = 0;private static void CalculateAndUpdatDatas(int chooseNumber) {float sum = CaluteTheFx(chooseNumber);boolean flages = sum * datas[chooseNumber][N] > 0 ? true : false;if (!flages) {TotalTimes = 0;a[chooseNumber] = a[chooseNumber] + t;b = b + t * datas[chooseNumber][N];} else {TotalTimes++;chooseNumber = (chooseNumber + 1) % NCount;}if (TotalTimes == NCount) return;CalculateAndUpdatDatas(chooseNumber);}private static float CaluteTheFx(int chooseNumber) {float sum = 0;for (int i = 0; i <=N; i++) sum += a[i] * datas[i][N] * gramMatrix[i][chooseNumber];return sum + b;}// 計算兩個向量的乘積private static int MultiplyTheDatas(int i, int j) {int sum = 0;for (int k = 0; k <N; k++) sum += datas[i][k] * datas[j][k];return sum;}} View Code

?

轉載于:https://www.cnblogs.com/09120912zhang/p/7682033.html

總結

以上是生活随笔為你收集整理的感知机算法的两种表示的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。