本篇文章为你整理了简单又高大上的项目(应付复试的小demo)()的详细内容,包含有 简单又高大上的项目(应付复试的小demo),希望能帮助你了解 简单又高大上的项目(应付复试的小demo)。
简单又高大上的项目
图形识别、自然语言处理(语言识别、语音转文字)、文字识别、区块链
1.java实现一个基本的文字识别
引入依赖
!-- ai 文字识别 --
dependency
groupId com.baidu.aip /groupId
artifactId java-sdk /artifactId
version 4.16.13 /version
/dependency
picToWord.Sample
调用百度智能云API: https://cloud.baidu.com/?_=1675227888185
package picToWord;
public static final String APP_ID = "30002607";
public static final String API_KEY = "lQ9sTDm6Bb5QQXnt8iGLuY0x";
public static final String SECRET_KEY = "vhboZlmy0x0FuZYxWnFbrTNHBaUDzwKn";
public static void main(String[] args) {
// 初始化一个AipOcr
AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);
// 可选:设置网络连接参数
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
// 可选:设置代理服务器地址, http和socket二选一,或者均不设置
// client.setHttpProxy("proxy_host", proxy_port); // 设置http代理
// client.setSocketProxy("proxy_host", proxy_port); // 设置socket代理
// 可选:设置log4j日志输出格式,若不设置,则使用默认配置
// 也可以直接通过jvm启动参数设置此环境变量
System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties");
// 调用接口
// String path = "test.jpg";
String path = "D:/vue/Ai/view.jpg";
JSONObject res = client.basicGeneral(path, new HashMap String, String
// getJSONObject是用来转换对象的,一般是{}这个符号括起来的内容,而getJSONArray是用来转换数组的,一般是[]这个符号括起来的内容,
// 参考 https://blog.csdn.net/weixin_44421896/article/details/124076501
JSONArray words_result = res.getJSONArray("words_result");
for (int i = 0; i words_result.length(); i++) {
// System.out.println(words_result.getJSONObject(i));
JSONObject jsonObject = words_result.getJSONObject(i);
Object words = jsonObject.get("words");
//转化为string类型的
String s = (String) words;
System.out.println(s);
System.out.println(res.toString(2));
2.实现完整的web项目(文字识别)
1.文字识别OCR原理: https://blog.csdn.net/q123456789098/article/details/79760579?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167505712716782425620880%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D request_id=167505712716782425620880 biz_id=0 utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~pc_rank_34-17-79760579-null-null.142v71pc_new_rank,201v4add_ask utm_term=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%ABOCR%E5%8E%9F%E7%90%86 spm=1018.2226.3001.4187
2.OpenCV+OCR 图像处理字符识别原理及代码:
(6条消息) OpenCV+OCR 图像处理字符识别原理及代码_p312011150的博客-CSDN博客
所需依赖
!-- ai 文字识别 --
dependency
groupId com.baidu.aip /groupId
artifactId java-sdk /artifactId
version 4.16.13 /version
/dependency
!-- thymeleaf--
dependency
groupId org.springframework.boot /groupId
artifactId spring-boot-starter-thymeleaf /artifactId
/dependency
2.1 utils.AiUtils
package com.example.demo.utils;
public static final String APP_ID = "30002607";
public static final String API_KEY = "lQ9sTDm6Bb5QQXnt8iGLuY0x";
public static final String SECRET_KEY = "vhboZlmy0x0FuZYxWnFbrTNHBaUDzwKn";
public static String picToWords(MultipartFile file) throws IOException {
// 初始化一个AipOcr
AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);
* 通用文字识别 client.basicGeneral(image, options); 用户向服务请求识别某张图中的所有文字。
* 身份证识别 client.idcard(image, idCardSide, options); 用户向服务请求识别身份证,身份证识别包括正面和背面。
* 银行卡识别 client.bankcard(image, options); 识别银行卡并返回卡号和发卡行。
* 驾驶证识别 client.drivingLicense(image, options); 对机动车驾驶证所有关键字段进行识别。
* 行驶证识别 client.vehicleLicense(image, options);
* 车牌识别 client.plateLicense(image, options); 识别机动车车牌,并返回号牌号码和车牌颜色。
* 火车票识别 client.trainTicket(image,EImgType.FILE, options) 支持对红、蓝火车票的13个关键字段进行结构化识别,包括车票号码、始发站、目的站、车次、日期、票价、席别、姓名、座位号、身份证号、售站、序列号、时间。
* 数字识别 client.numbers(image,options); 对图片中的数字进行提取和识别,自动过滤非数字内容,仅返回数字内容及其位置信息,识别准确率超过99%。
* 二维码识别 client.qrcode(file, options); 对图片中的二维码、条形码进行检测和识别,返回存储的文字信息。
* 手写文字识别 client.handwritingUrl(url, options); client.handwriting(file, options); 支持对图片中的手写中文、手写数字进行检测和识别,针对不规则的手写字体进行专项优化,识别准确率可达90%以上。
// 调用接口
JSONObject res = client.basicGeneral(file.getBytes(), new HashMap String, String
// getJSONObject是用来转换对象的,一般是{}这个符号括起来的内容,而getJSONArray是用来转换数组的,一般是[]这个符号括起来的内容,
// 参考 https://blog.csdn.net/weixin_44421896/article/details/124076501
JSONArray words_result = res.getJSONArray("words_result");
String result = "";
for (int i = 0; i words_result.length(); i++) {
// System.out.println(words_result.getJSONObject(i));
JSONObject jsonObject = words_result.getJSONObject(i);
Object words = jsonObject.get("words");
//转化为string类型的
String s = (String) words;
result += s + "";
// System.out.println(result);
return result;
import com.example.demo.utils.AiUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@RestController
public class AiController {
@RequestMapping("/pic")
public String PicToWord(@RequestParam("file") MultipartFile file) throws IOException {
String res = AiUtils.picToWords(file);
System.out.println(res);
return res;
2.3resources\templates\index.html
!DOCTYPE html
html lang="en"
head
meta charset="UTF-8"
title Ai Studio /title
!-- 引入样式 --
link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"
/head
body
h1 普通文本识别 /h1
div id="app"
el-upload
drag
action="/pic"
multiple
:on-success="dealSuccess"
i /i
div 将文件拖到此处,或 em 点击上传 /em /div
div slot="tip" 只能上传图片文件,且不超过500M /div
/el-upload
!-- 输出图片中文字的内容 --
!-- el-input v-model="words" /el-input --
el-input
type="textarea"
:rows="4"
v-model="words"
/el-input
h1 身份证识别 /h1
h1 票据识别 /h1
/div
/body
!-- import Vue before Element --
script src="https://unpkg.com/vue@2/dist/vue.js" /script
!-- import JavaScript 引入组件库 --
script src="https://unpkg.com/element-ui/lib/index.js" /script
script
new Vue({
el: #app,
data:{
words:
methods:{
dealSuccess(res,file){
console.log("res",res)
console.log("file",file)
this.words = res;
/script
/html
3. 人工智能项目背后知识学习
参考: https://www.paddlepaddle.org.cn/tutorials/projectdetail/4676538
这方面我也没有搞得很明白,所以我想通过考研,在研究生阶段来继续对它进行了解
学习项目背后的人工智能相关的技术和算法。以及常见名词,概念
1.通过 百度PaddlePaddle平台学习。
2.通过 bilibili 学习
4. 图像识别的实现及前后端分离(图像识别)
4.1controller.AiController
package com.example.demo.controller;
import com.example.demo.utils.AiFace;
import com.example.demo.utils.AiUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@RestController
public class AiController {
@RequestMapping("/img")
public String ImgToWord(@RequestParam("file") MultipartFile file) throws IOException {
String res = AiFace.imgRecognition(file);
System.out.println(res);
return res;
4.2utils.AiFace
package com.example.demo.utils;
import com.baidu.aip.imageclassify.AipImageClassify;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.HashMap;
public class AiFace {
//设置APPID/AK/SK
public static final String APP_ID = "30013654";
public static final String API_KEY = "q52mwPN5nWYGBGrApmGaEwIE";
public static final String SECRET_KEY = "eSVgkcpNsSWb51wZIdFFZbeujyf3bOHY";
public static String imgRecognition(MultipartFile file) throws IOException {
// 初始化一个AipImageClassify
AipImageClassify client = new AipImageClassify(APP_ID, API_KEY, SECRET_KEY);
/** 通用物体和场景识别 client.advancedGeneral(image, options); 输出图片中的多个物体及场景标签。
* 植物识别 client.plantDetect(image, options)
* 动物识别 client.animalDetect(image, options)
* 果蔬识别 client.ingredient(image, options); 输出图片中的果蔬食材结果。
* logo商标识别 client.logoSearch(image, options);
* 菜品识别 client.dishDetect(image, options); 输出图片的菜品名称、卡路里信息、置信度.
* 通用物体和场景识别 client.advancedGeneral(image, options); 输出图片中的多个物体及场景标签。
* 车辆识别 client.carDetect(image, options); 即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片的车辆品牌及型号。
* score:置信度,0-1 , 是有多大几率是什么
// 调用接口
// String path = "D:/vue/Ai/pic1.png";
JSONObject res = client.advancedGeneral(file.getBytes(), new HashMap String, String
// System.out.println(res.toString(2));
return res.toString(2);
4.3index.html
!DOCTYPE html
html lang="en"
head
meta charset="UTF-8"
title Ai Studio /title
!-- 引入样式 --
link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"
style
.a1{
align-items: center;
color: #f0c239;
width: 800px;
height: 600px;
border: 1px solid #5F9EA0;
margin: auto;
text-align: center;
.el-textarea__inner{
height: 200px;
/style
/head
body
div id="app"
div
h1 基于百度AI实现的文字识别demo示例 /h1
el-tabs v-model="activeName"
el-tab-pane label="文字识别" name="first"
!-- 文字识别--
el-upload
drag
action="/pic"
multiple
:on-success="dealSuccess"
i /i
div 将文件拖到此处,或 em 点击上传 /em /div
div slot="tip" 只能上传图片文件,且不超过500M /div
/el-upload
!-- 输出图片中文字的内容 --
!-- el-input v-model="words" /el-input --
el-input
type="textarea"
:rows="10"
v-model="words"
/el-input
/el-tab-pane
el-tab-pane label="身份证识别" name="second" 身份证识别 /el-tab-pane
el-tab-pane label="车牌识别" name="third"
el-upload
drag
action="/car"
multiple
:on-success="carRecognition"
i /i
div 将文件拖到此处,或 em 点击上传 /em /div
div slot="tip" 只能上传图片文件,且不超过500M /div
/el-upload
el-input
type="textarea"
:rows="10"
v-model="carpic"
/el-input
/el-tab-pane
el-tab-pane label="图像识别" name="fourth"
el-upload
drag
action="/img"
multiple
:on-success="ImageRecognition"
i /i
div 将文件拖到此处,或 em 点击上传 /em /div
div slot="tip" 只能上传图片文件,且不超过500M /div
/el-upload
el-input
type="textarea"
:rows="8"
v-model="imgpic"
/el-input
/el-tab-pane
/el-tabs
/div
!-- div 将文件拖到此处,或 em 点击上传 /em /div --
!-- div slot="tip" 只能上传图片文件,且不超过500M /div --
!-- /el-upload --
!-- ! ndash; 输出图片中文字的内容 ndash; --
!-- ! ndash; el-input v-model="words" /el-input ndash; --
!-- el-input--
!-- type="textarea"--
!-- :rows="4"--
!-- v-model="words" --
!-- /el-input --
!-- hr/ --
!-- h1 身份证识别 /h1 --
!-- hr/ --
!-- h1 车牌识别 /h1 --
!-- el-upload--
!-- --
!-- drag--
!-- action="/car"--
!-- multiple--
!-- :on-success="carRecognition" --
!-- i /i --
!-- div 将文件拖到此处,或 em 点击上传 /em /div --
!-- div slot="tip" 只能上传图片文件,且不超过500M /div --
!-- /el-upload --
!-- el-input--
!-- type="textarea"--
!-- :rows="4"--
!-- v-model="carpic" --
!-- /el-input --
!-- hr/ --
!-- h1 图像识别 /h1 --
!-- el-upload--
!-- --
!-- drag--
!-- action="/img"--
!-- multiple--
!-- :on-success="ImageRecognition" --
!-- i /i --
!-- div 将文件拖到此处,或 em 点击上传 /em /div --
!-- div slot="tip" 只能上传图片文件,且不超过500M /div --
!-- /el-upload --
!-- el-input--
!-- type="textarea"--
!-- :rows="4"--
!-- v-model="imgpic" --
!-- /el-input --
/div
/body
!-- import Vue before Element --
script src="https://unpkg.com/vue@2/dist/vue.js" /script
!-- import JavaScript 引入组件库--
script src="https://unpkg.com/element-ui/lib/index.js" /script
script
new Vue({
el: #app,
data:{
words:,
imgpic:,
carpic:,
activeName:first
methods:{
dealSuccess(res,file){
console.log("res",res)
console.log("file",file)
this.words = res;
ImageRecognition(res,file){
console.log("res",res)
console.log("file",file)
//将Array数组转换成JSON格式数组
this.imgpic = JSON.stringify(res.result);
carRecognition(res,file){
console.log("res",res)
this.carpic = JSON.stringify(res.words_result);
/script
/html
5.NLP自然语言处理(重点)开发及Python开发介绍
NLP自然语言处理 。 需要了解:NLP特点,优势、劣势,即基本实现原理。
6.区块链的基本理论知识
区块链技术与应用 学习的课程 :https://study.163.com/course/introduction/1006145002.htm?inLoc=ss_ssjg_tjlb_区块链
比特币和区块链 区别:跟先有鸡还是先有蛋是一样的道理
区块链主要是 概念多
主要考察:
1.区块链的数据结构 链式结构 默克尔树...
2.密码学 hash ,对称加密,非对称密码...
3.共识算法
区块链: 区块链就是一个大型分布式数据库,并且这个数据库是只能 查询和新增,不能删除和修改。
区块链特点: 只能查询 新增,不能删除和修改, 每一个群成员就是一个完整的数据库(比如 QQ群 微信群)
Hash
任意长度的数据和字符串 转化为一个固定长度的字符串
https://andersbrownworth.com/blockchain/hash
区块
中本聪 --论文 -- 比特币 一种点对点的电子现金系统
比特币: 1枚比特币= 211974 RBM
比特币设计原理:
设计一种数字货币需要考虑哪些问题?
中心化机构(银行、微信、支付宝)
非中心化的机构
7.以太坊和智能合约
ETH(以太坊)
区块链 2.0
智能合约(一个脚本代码)
智能合约相当于是跑在区块链上的代码
区块链共识算法:特点:
分布式共识算法
POW: 工作量证明(prove of work)
区块链共识算法总结(PBFT,Raft,PoW,PoS,DPoS,Ripple) - 小尾学长 - (cnblogs.com)
POS:股权证明
8.人工智能基础及基本概念
1.机器学习与深度学习和人工智能又是什么关系?
其实他们之间是包含与被包含的关系,下面展示了他们之间的关系图,如下所示
2.机器学习形式分类
机器学习是人工智能的主要表现形式,其学习形式主要分为:有监督学习、无监督学习、半监督学习等,对于“监督”一词,其实你可以把这个词理解为习题的“参考答案”,专业术语叫做“标记”。比如有监督学习就是有参考答案的学习,而无监督就是无参考答案。
1)有监督学习
有监督学习(supervised learning),需要你事先准备好要输入数据(训练样本)与真实的输出结果(参考答案),然后通过计算机的学习得到一个预测模型,再用已知的模型去预测未知的样本,这种方法被称为有监督学习。这也是最常见的机器学习方法。简单来说,就像你已经知道了试卷的标准答案,然后再去考试,相比没有答案就去考试准确率会更高,也更容易。
2)无监督学习
理解了有监督学习,那么无监督学习理解起来也变的容易。所谓无监督学习(unsupervised learning)就是在没有“参考答案”的前提下,计算机仅根据样本的特征或相关性,就能实现从样本数据中训练出相应的预测模型。
除了上述两种学习形式外,还有半监督学习和强化学习,有兴趣可以自己研究一下。
一句话描述学习方式
监督学习:训练数据包括正确的结果。
无监督学习:训练数据不包括正确的结果。
半监督学习:训练数据包含少量正确结果。
强化学习:根据每次结果收获的奖惩进行学习,根据结果实现优化。
监督学习包含:线性回归、逻辑回归、决策树、神经网铬、卷积神经网络、循环神经网铬等。
无监督学习:聚类算法。
混合学习:一般指监督学习+无鉴督学习
3.预测结果分类
根据预测结果的类型,我们可以对上述学习形式做具体的问题划分,这样就可以具体到实际的应用场景中,比如有监督学习可以划分为:回归问题 和 分类问题。如果预测结果是离散的,通常为分类问题,而为连续的,则是回归问题。
1)回归 分类
连续和离散是统计学中的一种概念,全称为“连续变量”和“离散变量”。比如身高,从1.2m到1.78m这个长高的过程就是连续的,身高只随着年龄的变化一点点的长高。那么什么是“离散变量”呢?比如超市每天的销售额,这类数据就是离散的,因为数据不是固定,可能多也可能少。关于什么是“回归”和“分类”在后续内容中会逐步讲解。
2)聚类
无监督学习是一种没有“参考答案”的学习形式,它通过在样本之间的比较、计算来实现最终预测输出,比如聚类问题,那什么是“聚类”?其实可以用一个成语表述“物以类聚,人以群分“,将相似的样本聚合在一起后,然后进行分析。关于聚类也会在后续内容中逐步讲解。
在学习机器学习技术的过程中,我们会遇到很多专业术语或者生僻词汇,这些名词大多数来自于数学或者统计学领域,比如模型、数据集、样本、熵,以及假设函数、损失函数等,这些属词汇于基本的常识,但是如果你第一次接触的话,也会感觉到些许惊慌。在下一节我们将介绍机器学习的常用术语。
本节需要知道的知识点:
1、人工智能、机器学习、深度学习是什么关系?
上面呢个图
2、什么是机器学习?
单从定义上来说,机器学习是一种功能、方法,或者更具体的说是一种算法,它能够赋予机器进行学习的能力,从而使机器完成一些通过编程无法直接实现的功能。但从具体的实践意义来说,其实机器学习是利用大量数据训练出一个最优模型,然后再利用此模型预测出其他数据的一种方法。比如要识别猫、狗照片就要拿它们各自的照片提炼出相应的特征(比如耳朵、脸型、鼻子等),从而训练出一个俱有预测能力的模型。
3、机器学习有哪些学习形式?
有监督学习、无监督学习、半监督学习、强化学习
4、预测结果有哪些类型,分别是什么?
回归 分类 和 聚类
9.机器学习专业术语
机器学习常用术语
机器学习是一门专业性很强的技术,它大量地应用了数学、统计学上的知识,因此总会有一些蹩脚的词汇,这些词汇就像“拦路虎”一样阻碍着我们前进,甚至把我们吓跑。因此认识,并理解这些词汇是首当其冲的任务。本节将介绍机器学习中常用的基本概念,为后续的知识学习打下坚实的基础。
机器学习术语
1)模型
模型这一词语将会贯穿整个教程的始末,它是机器学习中的核心概念。你可以把它看做一个“魔法盒”,你向它许愿(输入数据),它就会帮你实现愿望(输出预测结果)。整个机器学习的过程都将围绕模型展开,训练出一个最优质的“魔法盒”,它可以尽量精准的实现你许的“愿望”,这就是机器学习的目标。 如股票预测模型,房价预测模型、天气预测模型....
2)数据集
数据集,从字面意思很容易理解,它表示一个承载数据的集合,如果说“模型”是“魔法盒”的话。那么数据集就是负责给它充能的“能量电池”,简单地说,如果缺少了数据集,那么模型就没有存在的意义了。数据集可划分为“训练集”和“测试集”,它们分别在机器学习的“训练阶段”和"预测输出阶段”起着重要的作用。
3)样本 特征
样本指的是数据集中的数据,一条数据被称为”一个样本”,通常情况下,样本会包含多个特征值期来描述数据,比如现在有一组描述人形态的数据”180 70 25”如果单看数据你会非常茫然,但是用”特征”描述后就会变得容易理解,如下所示:
由上图可知数据集的构成是“一行一样本,一列一特征”。特征值也可以理解为数据的相关性,每一列的数据都与这一列的特征值相关。
4)向量
任何一门算法都会涉及到许多数学上的术语或者公式。在本教程写作的过程中也会涉及到很多数学公式,以及专业的术语,在这里我们先对常用的基本术语做一下简单讲解。
第一个常用术语就是“向量”,向量是机器学习的关键术语。向量在线性代数中有着严格的定义。向量也称欧几里得向量、几何向量、矢量,指具有大小和方向的量。您可以形象地把它的理解为带箭头的线段。箭头所指:代表向量的方向;线段长度:代表向量的大小。与向量对应的量叫做数量(物理学中称标量),数量只有大小,没有方向。向量既有大小又有方向
在机器学习中,模型算法的运算均基于线性代数运算法则,比如行列式、矩阵运算、线性方程等等。其实对于这些运算法则学习起来并不难,它们都有着一定运算规则,只需套用即可,因此你也不必彷徨,可参考向量运算法则。向量的计算可采用NmuPy来实现,如下所示:
import numpy as np
#构建向量数组
a=np.array([-1,2])
b=np.array([3,-1])
a_b=a+b
a2=a*2
b3=b*(-3)
b_a=a-b
print(a_b,a2,b3,b_a)
#矩阵乘法
a=np.array([1,2],[3,4])
b=np.array([4,3],[2,1])
c=np.matmul(a,b)
print(c)
简而言之,数据集中的每一个样本都是一条具有向量形式的数据。
矩阵也是一个常用的数据术语,你可以把矩阵看成由向量组成的二维数组,数据集就是以二维矩阵的形式存储数据的,你可以把它形象的理解为电子表格“一行一样本,一列一特征”表现形式如下:
假设函数 损失函数
机器学习在构建模型的过程中会应用大量的数学函数,正因为如此很多初学者对此产生畏惧,那么它们真会有这么可怕吗?其实我认为至少没有你想的那么可怕。从编程角度来看,这些函数就相当于模块中内置好的方法,只需要调用相应的方法就可以达成想要的目的。而要说难点,首先你要理解你的应用场景,然后根据实际的场景去调用相应的方法,这才是你更应该关注的问题。
假设函数和损失函数是机器学习中的两个重要概念,它并非某个模块下的函数方法,而是我们根据实际应用场景确定的一种函数形式,就像你解决数学的应用题目一样,根据题意写出解决问题的方程组。下面分别来看一下它们的含义。
1)假设函数
假设函数(Hypothesis Function)可表述为y=f(x)其中X表示输入数据,而y表示输出的预测结果,而这个结果需要不断的优化才会达到预期的结果,否则会与实际值偏差较大。
2)损失函数
损失函数(Loss Function)又叫目标函数,简写为L(x),这里的×是假设函数得出的预测结果“y”,如果L(x)的返回值越大就表示预测结果与实际偏差越大,越小则证明预测值越来越“逼近”真实值,这才是机器学习最终的目的。因此损失函数就像一个度量尺,让你知道“假设函数”预测结果的优劣,从而做出相应的优化策略。
3)优化方法
“优化方法”可以理解为假设函数和损失函数之间的沟通桥梁。通过L(x)可以得知假设函数输出的预测结果与实际值的偏差值,当该值较大时就需要对其做出相应的调整,这个调整的过程叫做“参数优化”,而如何实现优化呢?这也是机器学习过程中的难点。其实为了解决这一问题,数学家们早就给出了相应的解决方案,比如梯度下降、牛顿方与拟牛顿法、共轭梯度法等等。因此我们要做的就是理解并掌握“科学巨人”留下的理论、方法。
对于优化方法的选择,我们要根据具体的应用场景来选择应用哪一种最合适,因为每一种方法都有自己的优劣势,所以只有合适的才是最好的。
拟合 过拟合 欠拟合
拟合是机器学习中的重要概念,也可以说,机器学习的研究对象就是让模型能更好的拟合数据,那到底如何理解“拟合”这个词呢?
1)拟合
形象地说,“拟合”就是把平面坐标系中一系列散落的点,用一条光滑的曲线连接起来,因此拟合也被称为“曲线拟合”。拟合的曲线一般用函数进行表示,但是由于拟合曲线会存在许多种连接方式,因此就会出现多种拟合函数。通过研究、比较确定一条最佳的“曲线”也是机器学习中一个重要的任务。如下图所示,展示一条拟合曲线(蓝色曲线):
如何理解拟合,举个例子:上图假设为超市每天的营业额,通过对历史数据拟合出来一条拟合曲线,通过这个拟合曲线去预测未来的营业额。
提示:很多和数学相关的编程语言都内置计算拟合曲线的函数,比如MATLAB、Python Scipy等,在后续内容中还会介绍。
2)过拟合
过拟合(overfitting)与是机器学习模型训练过程中经常遇到的问题,所谓过拟合,通俗来讲就是模型的泛化能力较差,也就是过拟合的模型在训练样本中表现优越,但是在验证数据以及测试数据集中表现不佳。(我在股票预测模型中的表现特别好,每一天都全部都吻合,但是一旦预测股票,天天被割韭菜~)
举一个简单的例子,比如你训练一个识别狗狗照片的模型,如果你只用金毛犬的照片训练,那么该模型就只吸纳了金毛狗的相关特征,此时让训练好的模型识别一只“泰迪犬”,那么结果可想而知,该模型会认为“泰迪”不是一条狗。如下图所示:
过拟合问题在机器学习中经常遇到,主要是因的训练时样本过少,特征值过多导致的,后续还会详细介绍。
3)欠拟合
欠拟合(underfitting)恰好与过拟合相反,它指的是“曲线”不能很好的“拟合"数据。在训练和测试阶段,欠拟合模型表现均较差,无法输出理想的预测结果。如下图所示:
造成欠拟合的主要原因是由于没有选择好合适的特征值,比如使用一次函数(y=kx+b)去拟合具有对数特征值的散落点(y=log2x),示例图如下所示:
欠拟合和过拟合是机器学习中会遇到的问题,这两种情况都不是我期望看到的,因此要避免,关于如何处理类似问题,在后续内容中还会陆续讲解,本节只需要大家熟悉并理解常见的机器学习术语和一些概念即可。
本节需要知道的知识点:
1、机器学习常用术语?
2、假设函数 损失函数?
3、拟合 过拟合 欠拟合?
参考资料:《C语言中文网-机器学习算法》
10.基本人工智能工具的介绍与使用
1 python
这个不用我多说,自己去安装,教程可以参考我的博客:
三小时快速入门Python第一篇--原始数据类型与操作
2 numpy (矩阵计算)
NumPy(https://numpy.org/)属于 Python 的第三方扩展程序包,它是 Python 科学计算的基础库,提供了多维数组处理、线性代数、傅里叶变换、随机数生成等非常有用的数学工具。
NumPy 的安装方式非常简单,在安装好 Python 的基础上使用包管理器来安装,命令如下所示:
pip install numpy
使用案例:
a=np.array([[1,2],[3,4]])
b=np.array([[4,3],[2,1]])
# 矩阵乘法
c=np.matmul(a,b)
# 普通逐个相乘
result=np.multiply(a,b)
#1 2 4 3
#3 4 2 1
print(c)
print(result)
3 pandas(读取文件)
Pandas 属于 Python 第三方数据处理库,它基于 NumPy 构建而来,主要用于数据的处理与分析。我们知道对于机器学习而言数据是尤为重要,如果没有数据就无法训练模型。Pandas 提供了一个简单高效的 DataFrame 对象(类似于电子表格),它能够完成数据的清洗、预处理以及数据可视化工作等。除此之外,Pandas 能够非常轻松地实现对任何文件格式的读写操作,比如 CSV 文件、json 文件、excel 文件。
Pandas 安装非常简单,同样可以使用 pip 包管理器完成安装,如下所示:
pip install pandas
使用参考:
import pandas as pd
#前提是自己有data.csv 要不然报filenotfound错误
data = pd.read_csv(data.csv)
# 取x列
x = data.loc[:,x]
print(x)
y = data.loc[:,y]
print(y)
z = data.loc[:,y][x 20]
print(z)
np_array = np.array(x)
print(np_array)
x.to_csv(data_new.csv)
4 Matplotlib(数据可视化)
Matplotlib 是 Python 中最受欢迎的数据可视化软件包之一,支持跨平台运行,它是 Python 常用的 2D 绘图库,同时它也提供了一部分 3D 绘图接口。Matplotlib 通常与 NumPy、Pandas 一起使用,是数据分析中不可或缺的重要工具之一。
案例
import matplotlib
from matplotlib import pyplot as plt
%matplotlib inline
x = [1,2,3,4,5]
y = [5,4,3,2,1]
# 绘制连线图
plt.plot(x,y)
plt.title(y vs x)
plt.xlabel(x)
plt.ylabel(y)
plt.show( )
#绘制散点图
plt.scatter(x,y)
plt.show( )
5 Scikit-Learn(算法库)
最后介绍机器学习中的重要角色 Scikit-Leran(官网:https://scikit-learn.org/stable/),它是一个基于 Python 语言的机器学习算法库。Scikit-Learn 主要用 Python 语言开发,建立在 NumPy、Scipy 与 Matplotlib 之上,它提供了大量机器学习算法接口(API),因此你可以把它看做一本“百科全书”。由于 Scikit-Learn 的存在极大地提高了机器学习的效率,让开发者无须关注数学层面的公式、计算过程,有更多的更多的时间与精力专注于业务层面,从而解决实际的应用问题。
Scikit-Learn 的基本功能主要被分为六大部分:分类,回归,聚类,数据降维,模型选择和数据预处理。本教程将围绕机器算法的讲解 Scikit-Learn 实际的应用。 Scikit-Learn 安装也非常简单,执行以下命令即可安装:
pip install scikit-learn
11.线性回归
11.1回归分析
回归分析:根据数据,确定两种或两种以上变量间相互依赖的定量关系。
函数表达式为:
y=f(x1,x2,x3...xn)
如 y=ax+b, y=ax1+bx2+c
x代表的就是指的影响因素, 如 y=ax1+bx2+c可以指:多大面积 和 是不是学区房
11.2线性回归
线性回归:回归分析中,变量与因变量存在线性关系。
函数表达为: y=ax+b
11.3房价预测案例
问题:面积110平米售价150万是否值得投资?
步骤:
1.设P为价格A为面积,确定P、A间的定量关系。即P=f(A)
2.根据关系预测合理价格。P=f(110)
3.做出判断
问题:如何求出函数P=f(A)
使用线性模型y=ax+b去拟合现有的数据。那么问题就在于如何去寻找a和b。
哪一个a和b比较合适呢?
11.4梯度下降法
梯度下降法是寻找极小值的一种方法。通过向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索,直到在极小点收敛。
梯度下降法案例
逐渐接近极小值点(p=2)
梯度下降法动态图:
梯度下降法
重复计算直到收敛
效果展示:
其他线性回归案例
1.百万人口/医生预测平均寿命问题
年龄预测身高
3.住宅面积预测房价
12.-实战:Sklearn求解线性回归问题
1 实战目标
基于generated_data.csv数据,建立线性回归模型,预测x=3.5对应的y值,评估模型表现。
学会用Sklearn求解线性回归问题,寻找a、b (y = ax + b) 并且评估模型的好坏。
数据如下:
2 步骤
第一步:
#加载数据
import pandas as pd
data = pd.read_csv(generated_data.csv)
data.head()
x = data.loc[:,x]
y = data.loc[:,y]
print(x,y)
#visualize the data
from matplotlib import pyplot as plt
plt.figure(figsize=(20,20))
#scatter:代表散点图
plt.scatter(x,y)
plt.show()
#set up a linear regression model 设置一个线性回归模型
from sklearn.linear_model import LinearRegression
lr_model = LinearRegression()
#np.array:进行类型转换 reshape:转换维度,要不然绘制不进去
import numpy as np
x = np.array(x)
x = x.reshape(-1,1)
y = np.array(y)
y = y.reshape(-1,1)
print(type(x),x.shape,type(y),y.shape)
print(type(x),x.shape)
#训练模型
lr_model.fit(x,y)
y_predict = lr_model.predict(x)
print(y_predict)
#预测3.5
y_3 = lr_model.predict([[3.5]])
print(y_3)
print(y)
#a\b 打印 y=ax+b
a = lr_model.coef_
b = lr_model.intercept_
print(a,b)
y 与y’的均方误差(MSE):
R方值(R2):
MSE越小越好,R^2分数越接近1越好
# 计算y 与y’的均方误差(MSE)、R方值(R2_score):
from sklearn.metrics import mean_squared_error,r2_score
MSE = mean_squared_error(y,y_predict)
R2 = r2_score(y,y_predict)
print(MSE,R2)
1.实战任务
基于 usa_housing _price.csv 数据,建立线性回归模型,预测合理房价:
1、作业1:以面积为输入变量,建立单因子模型, 评估模型表现,可视化线性回归预测结果
2、作业2:以income、house age、numbers of rooms、population、area为输入变量,建立多因子模型,评估模型表现
3、预测 Income=65000,,House Age=5, Number of Rooms=5, Population=30000, size=200的合理房价
plt.scatter(data.loc[:,Avg. Area Income],data.loc[:,Price])
plt.title(Price VS Income)
fig2 =plt.subplot(232)
plt.scatter(data.loc[:,Avg. Area House Age],data.loc[:,Price])
plt.title(Price VS House Age)
fig3 =plt.subplot(233)
plt.scatter(data.loc[:,Avg. Area Number of Rooms],data.loc[:,Price])
plt.title(Price VS Number of Rooms)
fig4 =plt.subplot(234)
plt.scatter(data.loc[:,Area Population],data.loc[:,Price])
plt.title(Price VS Area Population)
fig5 =plt.subplot(235)
plt.scatter(data.loc[:,size],data.loc[:,Price])
plt.title(Price VS size)
plt.show()
#定义 x 和 y
X = data.loc[:,size]
y = data.loc[:,Price]
y.head()
# 转换维度
X = np.array(X).reshape(-1,1)
print(X.shape)
from sklearn.metrics import mean_squared_error,r2_score
mean_squared_error_1 = mean_squared_error(y,y_predict_1)
r2_score_1 = r2_score(y,y_predict_1)
print(mean_squared_error_1,r2_score_1)
fig6 = plt.figure(figsize=(8,5))
plt.scatter(X,y)
plt.plot(X,y_predict_1,r) # r:代表红色
plt.show()
作业2
#定义多因子x
#删除掉Price列
X_multi = data.drop([Price],axis=1)
X_multi
#第二个线性模型
LR_multi = LinearRegression()
#train the model
LR_multi.fit(X_multi,y)
#多因子预测
y_predict_multi = LR_multi.predict(X_multi)
print(y_predict_multi)
#模型评估
mean_squared_error_multi = mean_squared_error(y,y_predict_multi)
r2_score_multi = r2_score(y,y_predict_multi)
print(mean_squared_error_multi,r2_score_multi)
print(mean_squared_error_1)
fig7 = plt.figure(figsize=(8,5))
plt.scatter(y,y_predict_multi)
plt.show()
fig8 = plt.figure(figsize=(8,5))
plt.scatter(y,y_predict_1)
plt.show()
X_test = [65000,5,5,30000,200]
X_test = np.array(X_test).reshape(1,-1)
print(X_test)
y_test_predict = LR_multi.predict(X_test)
print(y_test_predict)
实战结果
线性回归房价实战summary:
1、通过搭建线性回归模型,实现单因子的房屋价格预测;
2、在单因子模型效果不好的情况下,通过考虑更多的因子,建立了多因子模型;
3、多因子模型达到了更好的预测效果,r2分数为0.91;
4、实现了预测结果的可视化,直观对比预测价格与实际价格的差异。
14.逻辑回归
我们知道有监督学习分为“回归问题”和“分类问题”,前而我们已经认识了什么是“回归问题”,从本节开始我们将讲解“分类问题”的相关算法。在介绍具体的算法前,我们先聊聊到底什么是分类问题。
1.什么是分类问题?
其实想要理解“分类”问题非常的简单,我们不妨拿最简单的“垃级分类处理”的过程来认识一下这个词。现在考虑以下场景:
小明拎着两个垃圾袋出门倒垃级,等走到垃级回收站的时候。小明发现摆放着两个垃级桶。上面分别贴着“可回收”与“不可回收”。小明经过自己的判断后,把自己右手的垃极故进了贴有“不可回收”的垃极桶内,而左手的垃圾袋放进了“可回收”的垃圾桶内,最终完成了这次倒垃吸的过程。
其实上述“倒垃级”的案例就说明了“分类问题”的过程。“可回收”与“不可回收”是两种预测分类,而小明是主观判断的个体,他通过自己日常接触的知识对“垃圾种类”做出判断,我们把这个程称作“模型训练”,只有通过“训练”才可以更加准确地判断“垃吸”的种类。小明进行了两次投放动作,每一次投故都要对“垃圾”种类做出预先判断,最终决定投放到哪个垃吸桶内。这就是根据模型训练的结果进行预测的整个过程。
除了垃圾分类之外,我们常见的还有垃圾邮件分类,一般来说我们如何去判断邮件是否是垃圾邮件?一般来说只要发件人中含一些乱七八遭的符号例如「sda# *sd@123.com」、「dsah%qwe@889.com」并且邮件中包含「赌博」「博彩」「同城yp」「百家乐」这些彩票会被我们认为是垃圾邮件。
下面对上述分类过程做简单总结:
模型训练:以小明为主体,把他所接受的知识、经验做为模型训练的参照。(获取特征)·
分类问题是当前机器学习的研究热点,它被广泛应用到各个领域,比图像识别、垃圾邮件处理、预测天气、疾病诊断、文字识别等等。“分类问题”的预测结果是离散的,它比线性回归要更加复杂,那么我们应该从何处着手处理“分类问题”呢,这就需要使用到我们的分类算法。
1.分类算法
1.1逻辑回归算法
1.2.KNN近邻算法
1.3.决策树
1.4神经网络
2 Logistic回归算法
也许乍一看算法名字,你会认为它是用来解决“回归问题”的算法,但其实它是针对“分类问题”的算法。
2.1逻辑回归介绍
Logistic回归算法,又叫做逻辑回归算法,或者LR算法(Logistic Regression)。分类问题同样也可以基于“线性模型”构建。“线性模型”最大的特点就是“直来直去”不会打弯,而我们知道,分类问题的预测结果是“离散的”,即对输出数据的类别做判断。比如将类别预设条件分为“0”类和“1”类(或者“是”或者“否”)那么图像只会在“0”和“1”之间上下起伏,如下图所示:
此时你就可能会有很多疑问,线性回归函数不可能“拟合”上述图像。没错,所以接下来我们要学习另一个线性函数Logistic函数。
注意:在机器学习中,L0gsc函数通常用来解决二元分类问题,也就是涉及两个预设类别的问。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。