感知机算法的原始形式

输入:训练数据集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

感知机算法的两种表示相关推荐

  1. 算法:两种步长的希尔排序算法

    算法:两种希尔排序算法 1 /** 2 * 希尔排序 3 * 不同步长的算法 4 * @author mackxu 5 * 6 */ 7 class ShellSort { 8 private int ...

  2. 迪杰斯特拉【dijkstra】算法的两种实现和简单的正确性理解

    先来讲一下迪杰斯特拉算法的正确性,即为什么按照迪杰斯特拉的那套逻辑来就能找到起点到终点的最短距离? 这个其实逻辑的内核其实是和用广搜来求最短路径是一样一样的,举一个形象的例子: 你见过会长矮的树嘛?嘿 ...

  3. 人工神经网络算法与机器算法算两种算法吗

    人工神经网络的特点有哪些 人工神经网络的特点和优越性,主要表现在三个方面:第一,具有自学习功能. 例如实现图像识别时,只在先把许多不同的图像样板和对应的应识别的结果输入人工神经网络,网络就会通过自学习 ...

  4. 二分查找算法的两种实现方式:非递归实现和递归实现

    二分查找的条件是对一组有序数组的查找,这一点很容易忘记,在使用二分查找的时候先要对数组进行排序. 先说一下二分查找的思路:一个有序数组,想要查找一个数字key的下标,首先算出中间下标mid,利用mid ...

  5. 蚁群算法,PSO算法以及两种算法可以融合的几种方法

    蚁群算法(ACO)是受自然界中蚂蚁搜索食物行为的启发,是一种群智能优化算法.它基于对自然界真实蚁群的集体觅食行为的研究,模拟真实的蚁群协作过程.算法由若干个蚂蚁共同构造解路径,通过在解路径上遗留并交换 ...

  6. 空间射线与三角形相交算法的两种实现

    文章目录 1. 概述 2. 常规算法 2.1. 理论推导 2.2. 具体实现 3. 优化算法 3.1. 理论推导 3.2. 具体实现 4. 参考 1. 概述 任何复杂的三维模型都可以视作空间三角面片的 ...

  7. 全排列的java算法_两种常用的全排列算法(java)

    问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符 ...

  8. 汉诺塔算法的两种实现思路

    题目: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序 ...

  9. 十五、插入排序算法(两种方式)

    一.插入排序法思想 插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有 序表中只包含一个元素,无序表中包含有 n-1 个元素,排序 ...

最新文章

  1. const与define相比优点_const与#define的区别、优点
  2. winform剪贴板如何同时存储图片和文字_你真的会在Word里插入图片吗?没那么简单!...
  3. React Native之箭头函数和延展操作符(...)
  4. dreamweaver翻译器没有被装载由于错误coldfusion.htm有不正确的设置信息
  5. Redis在PHP项目中的应用
  6. Launch failed - cleaning up connection
  7. WebSocket科普
  8. 没有服务器配置信息是怎么回事,isp服务器未配置怎么回事
  9. List集合取交集、并集、差集
  10. Pr教程之打字机效果
  11. JAVA32位的如何换成64位的_win10系统中怎么把32位改成64位教程
  12. Print2Flash 3汉化破解版下载
  13. BFS(宽度优先算法)
  14. 从Facebook更名Meta看元宇宙||亚太元宇宙新纪元峰会正式启动
  15. 淘宝母婴商品分析-Python
  16. 年薪50W京东软件测试工程师的成长路 —— 我们都曾一样迷茫
  17. 中国首枚NFC邮票发行背后,NFC技术的“有限性”创新
  18. Linux:打包压缩
  19. 可扩展标记语言XML之一:XML的概念、作用与示例
  20. 1.2文字排版、颜色、表格、图像形状、Jumbotron、信息提示框、按钮、按钮组、徽章、加载效果、分页、列表组、卡片、下拉菜单、折叠

热门文章

  1. ubuntu安装lrzsz报错“E: Unable to locate package”
  2. Python MyQR
  3. Node.js Buffer静态方法
  4. 按键精灵_按键精灵——办公常用脚本集锦
  5. mitmdump 脚本使用python第三方包方法(报错:in script xxx.py: No module named ‘xxx‘)
  6. Navicat for SQLite 15中文版
  7. 使用PHPExcel判别和格式化Excel中的日期格式
  8. 这两天发现一个老外用JavaScript编写的好东西:dp.SyntaxHighlighter。
  9. 4.12—002—周五
  10. Cocos2d-x 常见宏