首先先来讲讲闲话

  如果让你现在去搞机器学习,你会去吗?不会的话是因为你对这方面不感兴趣,还是因为你觉得这东西太难了,自己肯定学不来?如果你觉的太难了,很好,相信看完这篇文章,你就会有胆量踏入机器学习这一领域。

  机器学习(Machine-Learning),一个在才学一年编程的人看来十分高大尚的东西,不知不觉就接触了它。暑假的时候表哥给我布置了任务,在github上有一篇DeepLearningFlappyBird,他当时要我一天之内先让这段代码跑起来,然后第二天再把这段代码翻译成C++的.......wtf???我当时一脸懵逼,一个才学编程一年不到的,C和C++的水平也就差不多是大学课堂教完后的那种,跑起来可能还算容易,但要翻译?!!   饶了我吧  orz。。。当时配了一天的环境,到那天晚上快12点了,终于跑起来了。然后到了第二天,我先去查了查tensorflow,opencv3在VS上使用,发现根本搞不定。。。我电脑上装的是VS2013,里面只有32位的,emmmm。。得下个VS2017,看了看电脑空间,不够了!好的,放弃,以后有空闲得慌了再来搞吧。。。。

  前几天开学了,还没什么事干,突然就想到机器学习了(其实dalao提到了感知机这东西),就试着去做了做,也就当个入门吧。

再来聊聊机器学习

  机器学习说白了跟人类学习是一样的,只不过机器可以无止境的学习,并且,机器学习时完全不需要懂什么原理,只要知道怎么去实现就行。就如Alpha Go,你们觉得它懂得棋理吗?我觉得肯定不懂,但通过对无数的棋谱的学习,让人觉得它肯定掌握了围棋的真谛。

  机器学习的标准范式表达

对于一个Task及其Performance的度量方法,给出特定的Algorithm,能够通过利用Experience Data不断提高在该Task上的
Performance的方法,就称为机器学习。

  其实这个定义就是“学习”的全部含义,这个事情按照机器的思路来做,就是机器学习

  说白了,只要算法合理,每次学习都能有提高,机器有足够的运算能力,就能将机器的能力达到极致从而超越人类。机器学习的本质就是建立("数据"——"认知")关系库。

下面就来讲讲感知机

  先扯扯定义:感知机(perceptron)是二分类的线性分类模型,输入为实例的特征向量,输出为实例的类别(取+1和-1)。感知机对应于输入空间中将实例划分为两类的分离超平面。感知机旨在求出该超平面,为求得超平面导入了基于误分类的损失函数,利用梯度下降法 对损失函数进行最优化(最优化)。感知机的学习算法具有简单而易于实现的优点,分为原始形式和对偶形式。感知机预测是用学习得到的感知机模型对新的实例进行预测的,因此属于判别模型。感知机由Rosenblatt于1957年提出的,是神经网络和支持向量机的基础。

  拿二维平面举例,

看这张图,很明显,直线没有将红蓝点完全分开在两个区域,我们可以将其称为错误的直线,感知机要做的,就是根据各点坐标,将错误的直线纠正为正确的,这样得到的直线就是训练的结果。

说了这么多,要怎么实现呢?  看下面的流程图

    /*
* 判断所有点的位置关系,进行分类
*/
public boolean classify() {
boolean flag = false;
while (!flag) {
for (int i = 0; i < arrayList.size(); i++) {
if (Anwser(arrayList.get(i)) <= 0) {
Update(arrayList.get(i));
break;
}
if (i + 1 == arrayList.size()) {
flag = true;
}
}
}
return true;
}
    /*
* 点乘返回sum
*/
private double Dot(double[] w, double[] x) {
double sum = 0;
for (int i = 0; i < x.length; i++) {
sum += w[i] * x[i];
}
return sum;
} /*
* 返回函数计算的值
*/
private double Anwser(Point point) {
System.out.println(Arrays.toString(w));
System.out.println(b);
return point.y * (Dot(w, point.x) + b);
}

如果还有疑问,那可能就是w与b怎么修改了,我们会定义一个变量η(0≤η≤1)作为步长,在统计学是中成为学习速率。步长越大,梯度下降的速度越快,更能接近极小点。如果步长过大,有可能导致跨过极小点,导致函数发散;如果步长过小,有可能会耗很长时间才能达到极小点。默认为1

对于wi   wi+=η*y*xi

对于b      b+=η*y

    public void Update(Point point) {
for (int i = 0; i < w.length; i++) {
w[i] += eta * point.y * point.x[i];
}
b += eta * point.y;
return;
}

这样,我们就可以完成成w、b的更新了。

将上面的步骤组合起来,就可以实现感知机了。

谈谈自己的想法

  写了这个感知机后,发现机器学习并不是想象当中那么难,其实只要知道怎么去算就可以了(目前比较浅显的理解,可能我还没接触到难的地方),而且Python中,有关机器学习的库可以说是很完善了,如果熟悉了这些库的用法,即使不懂算法,也时能用这些库来做开发的,要知道算法岗和开发岗还是不一样的

这是我选取的测试用例及结果

         Point p1 = new Point(new double[] { 0, 0, 0, 1 }, -1);
Point p2 = new Point(new double[] { 1, 0, 0, 0 }, 1);
Point p3 = new Point(new double[] { 2, 1, 0, 0 }, 1);
Point p4 = new Point(new double[] { 2, 1, 0, 1 }, -1);
[0.0, 0.0, 0.0, 0.0]
0.0
[0.0, 0.0, 0.0, -1.0]
-1.0
[0.0, 0.0, 0.0, -1.0]
-1.0
[1.0, 0.0, 0.0, -1.0]
0.0
[1.0, 0.0, 0.0, -1.0]
0.0
[1.0, 0.0, 0.0, -1.0]
0.0
[1.0, 0.0, 0.0, -1.0]
0.0
[-1.0, -1.0, 0.0, -2.0]
-1.0
[-1.0, -1.0, 0.0, -2.0]
-1.0
[0.0, -1.0, 0.0, -2.0]
0.0
[0.0, -1.0, 0.0, -2.0]
0.0
[1.0, -1.0, 0.0, -2.0]
1.0
[1.0, -1.0, 0.0, -2.0]
1.0
[1.0, -1.0, 0.0, -2.0]
1.0
[1.0, -1.0, 0.0, -2.0]
1.0
[-1.0, -2.0, 0.0, -3.0]
0.0
[-1.0, -2.0, 0.0, -3.0]
0.0
[0.0, -2.0, 0.0, -3.0]
1.0
[0.0, -2.0, 0.0, -3.0]
1.0
[0.0, -2.0, 0.0, -3.0]
1.0
[2.0, -1.0, 0.0, -3.0]
2.0
[2.0, -1.0, 0.0, -3.0]
2.0
[2.0, -1.0, 0.0, -3.0]
2.0
[2.0, -1.0, 0.0, -3.0]
2.0
[0.0, -2.0, 0.0, -4.0]
1.0
[0.0, -2.0, 0.0, -4.0]
1.0
[0.0, -2.0, 0.0, -4.0]
1.0
[2.0, -1.0, 0.0, -4.0]
2.0
[2.0, -1.0, 0.0, -4.0]
2.0
[2.0, -1.0, 0.0, -4.0]
2.0
[2.0, -1.0, 0.0, -4.0]
2.0
[0.0, -2.0, 0.0, -5.0]
1.0
[0.0, -2.0, 0.0, -5.0]
1.0
[0.0, -2.0, 0.0, -5.0]
1.0
[2.0, -1.0, 0.0, -5.0]
2.0
[2.0, -1.0, 0.0, -5.0]
2.0
[2.0, -1.0, 0.0, -5.0]
2.0
[2.0, -1.0, 0.0, -5.0]
2.0
[0.0, -2.0, 0.0, -6.0]
1.0
[0.0, -2.0, 0.0, -6.0]
1.0
[0.0, -2.0, 0.0, -6.0]
1.0
[2.0, -1.0, 0.0, -6.0]
2.0
[2.0, -1.0, 0.0, -6.0]
2.0
[2.0, -1.0, 0.0, -6.0]
2.0
[2.0, -1.0, 0.0, -6.0]
2.0

机器学习入门 一、理解机器学习+简单感知机(JAVA实现)的更多相关文章

  1. Spark机器学习 Day2 快速理解机器学习

    Spark机器学习 Day2 快速理解机器学习 有两个问题: 机器学习到底是什么. 大数据机器学习到底是什么. 机器学习到底是什么 人正常思维的过程是根据历史经验得出一定的规律,然后在当前情况下根据这 ...

  2. 机器学习入门18 - 生产机器学习系统(Production ML Systems)

    除了实现机器学习算法之外,机器学习还包含许多其他内容.生产环境机器学习系统包含大量组件.无需自行构建所有内容,而是应该尽可能重复使用常规机器学习系统组件.通过了解机器学习系统的一些范例及其要求,可以明 ...

  3. 机器学习入门 - Google的机器学习速成课程

    1 - MLCC 通过机器学习,可以有效地解读数据的潜在含义,甚至可以改变思考问题的方式,使用统计信息而非逻辑推理来处理问题. Google的机器学习速成课程(MLCC,machine-learnin ...

  4. 机器学习入门之四:机器学习的方法--SVM(支持向量机)(转载)

    转自 飞鸟各投林 SVM(支持向量机) 支持向量机算法是诞生于统计学习界,同时在机器学习界大放光彩的经典算法. 支持向量机算法从某种意义上来说是逻辑回归算法的强化:通过给予逻辑回归算法更严格的优化条件 ...

  5. pyhton机器学习入门基础(机器学习与决策树)

    //2019.07.26#scikit-learn数据挖掘工具包1.Scikit learn是基于python的数据挖掘和机器学习的工具包,方便实现数据的数据分析与高级操作,是数据分析里面非常重要的工 ...

  6. 有向图的拓扑排序的理解和简单实现(Java)

    如果图中存在环(回路),那么该图不存在拓扑排序,在这里我们讨论的都是无环的有向图. 什么是拓扑排序 一个例子 对于一部电影的制作过程,我们可以看成是一个项目工程.所有的工程都可以分为若干个" ...

  7. 机器学习入门 - Google机器学习速成课程 - 笔记汇总

    机器学习入门 - Google机器学习速成课程 https://www.cnblogs.com/anliven/p/6107783.html MLCC简介 前提条件和准备工作 完成课程的下一步 机器学 ...

  8. [转]MNIST机器学习入门

    MNIST机器学习入门 转自:http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html?plg_ ...

  9. web安全之机器学习入门——3.1 KNN/k近邻

    目录 sklearn.neighbors.NearestNeighbors 参数/方法 基础用法 用于监督学习 检测异常操作(一) 检测异常操作(二) 检测rootkit 检测webshell skl ...

随机推荐

  1. Delphi 的内存操作函数(5): 复制内存

    MoveMemory.CopyMemory 的功能类似, 都是复制内存, 都是调用 Move 过程; MoveMemory.CopyMemory 操作指针; Move 操作实体. 还要注意, 它们的参 ...

  2. HDU 6156 数位dp

    Palindrome Function Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Ot ...

  3. LeetCode 8 有效的括号

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符串可被认 ...

  4. ubuntu 下 python模块 mysql-python安装(转)

    原文:http://www.cnblogs.com/51kata/p/5406468.html 直接运行如下命令 sudo pip install MySQL-python 报如下错误 xxx@ubu ...

  5. Flink窗口介绍及应用

    Windows是Flink流计算的核心,本文将概括的介绍几种窗口的概念,重点只放在窗口的应用上. 本实验的数据采用自拟电影评分数据(userId, movieId, rating, timestamp ...

  6. Linux shell 日期,时间相关的命令

    在shell脚本中,经常要用到跟获取日期相关的东西,这里记录一下Linux shell 获取日期的方法 获取当前日期:today=`date +"%Y-%m-%d"` 获取昨天的日 ...

  7. python获取指定目录下所有文件名os.walk和os.listdir

    python获取指定目录下所有文件名os.walk和os.listdir 觉得有用的话,欢迎一起讨论相互学习~Follow Me os.walk 返回指定路径下所有文件和子文件夹中所有文件列表 其中文 ...

  8. HDU 3537 基础翻硬币模型 Mock Turtles 向NIM转化

    翻硬币游戏,任意选3个,最右边的一个必须是正面.不能操作者败. 基本模型..不太可能自己推 还是老实记下来吧..对于单个硬币的SG值为2x或2x+1,当该硬币的位置x,其二进制1的个数为偶数时,sg= ...

  9. [python]文件操作read&readline&readlines

    (1)read是将整个文件读入内存,将整个文件的内容当作一个字符串 (2)readline是一行一行的读如内存,每一次读的一行为一个字符串 (3)readlines是一次将整个文件读入内存,但是将整个 ...

  10. iOS代码规范之命名规范

    技术博客http://www.cnblogs.com/ChenYilong/    新浪微博http://weibo.com/luohanchenyilong   命名规范类命名    首字母大写,之 ...