简单又高大上的项目(应付复试的小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;


import java.util.*;

import org.json.JSONArray;
import org.json.JSONObject;
import com.baidu.aip.ocr.AipOcr;
public class Sample {
    //设置APPID/AK/SK
    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;


import com.baidu.aip.ocr.AipOcr;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.HashMap;

public class AiUtils {
    //设置APPID/AK/SK
    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;
    }


}


2.2 controller.AiController

package com.example.demo.controller;

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 emplatesindex.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
            class="upload-demo"
            drag
            action="/pic"
            multiple
            :on-success="dealSuccess">
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        <div class="el-upload__tip" 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 class="a1" >
        <h1 >基于百度AI实现的文字识别demo示例</h1>
        <el-tabs v-model="activeName" >
            <el-tab-pane label="文字识别" name="first">
                <!--            文字识别-->
                <el-upload
                        class="upload-demo"
                        drag
                        action="/pic"
                        multiple
                        :on-success="dealSuccess">
                    <i class="el-icon-upload"></i>
                    <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
                    <div class="el-upload__tip" 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
                        class="upload-demo"
                        drag
                        action="/car"
                        multiple
                        :on-success="carRecognition">
                    <i class="el-icon-upload"></i>
                    <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
                    <div class="el-upload__tip" 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
                        class="upload-demo"
                        drag
                        action="/img"
                        multiple
                        :on-success="ImageRecognition">
                    <i class="el-icon-upload"></i>
                    <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
                    <div class="el-upload__tip" slot="tip">只能上传图片文件,且不超过500M</div>
                </el-upload>
                <el-input
                        type="textarea"
                        :rows="8"
                        v-model="imgpic">
                </el-input>
            </el-tab-pane>
        </el-tabs>
    </div>



<!--    <h1>普通文本识别</h1>-->
<!--    <el-upload-->
<!--            class="upload-demo"-->
<!--            drag-->
<!--            action="/pic"-->
<!--            multiple-->
<!--            :on-success="dealSuccess">-->
<!--        <i class="el-icon-upload"></i>-->
<!--        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>-->
<!--        <div class="el-upload__tip" slot="tip">只能上传图片文件,且不超过500M</div>-->
<!--    </el-upload>-->
<!--&lt;!&ndash;  输出图片中文字的内容  &ndash;&gt;-->
<!--&lt;!&ndash;    <el-input v-model="words" ></el-input>&ndash;&gt;-->
<!--    <el-input-->
<!--            type="textarea"-->
<!--            :rows="4"-->
<!--            v-model="words">-->
<!--    </el-input>-->
<!--    <hr/>-->
<!--    <h1>身份证识别</h1>-->
<!--    <hr/>-->
<!--    <h1>车牌识别</h1>-->
<!--    <el-upload-->
<!--            class="upload-demo"-->
<!--            drag-->
<!--            action="/car"-->
<!--            multiple-->
<!--            :on-success="carRecognition">-->
<!--        <i class="el-icon-upload"></i>-->
<!--        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>-->
<!--        <div class="el-upload__tip" slot="tip">只能上传图片文件,且不超过500M</div>-->
<!--    </el-upload>-->
<!--    <el-input-->
<!--            type="textarea"-->
<!--            :rows="4"-->
<!--            v-model="carpic">-->
<!--    </el-input>-->
<!--    <hr/>-->
<!--    <h1>图像识别</h1>-->
<!--    <el-upload-->
<!--            class="upload-demo"-->
<!--            drag-->
<!--            action="/img"-->
<!--            multiple-->
<!--            :on-success="ImageRecognition">-->
<!--        <i class="el-icon-upload"></i>-->
<!--        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>-->
<!--        <div class="el-upload__tip" 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>

image-20230131125221895

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

image-20230129204345784

区块

image-20230129204507300

比特币

中本聪 –论文 — 比特币 一种点对点的电子现金系统

比特币: 1枚比特币= 211974 RBM

比特币设计原理

设计一种数字货币需要考虑哪些问题?

中心化机构(银行、微信、支付宝)

非中心化的机构

7.以太坊和智能合约

ETH(以太坊)

区块链 2.0

智能合约(一个脚本代码)

智能合约相当于是跑在区块链上的代码

区块链共识算法:特点:

分布式共识算法

POW: 工作量证明(prove of work)

区块链共识算法总结(PBFT,Raft,PoW,PoS,DPoS,Ripple) – 小尾学长 – 云海天 (cnblogs.com)

POS:股权证明

8.人工智能基础及基本概念

1.机器学习与深度学习和人工智能又是什么关系?

其实他们之间是包含与被包含的关系,下面展示了他们之间的关系图,如下所示

image-20230130110739291

image-20230130110931829

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”如果单看数据你会非常茫然,但是用”特征”描述后就会变得容易理解,如下所示:

身高 体重 年龄
180 70 25
179 68 26

由上图可知数据集的构成是“一行一样本,一列一特征”。特征值也可以理解为数据的相关性,每一列的数据都与这一列的特征值相关。

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. 矩阵

​ 矩阵也是一个常用的数据术语,你可以把矩阵看成由向量组成的二维数组,数据集就是以二维矩阵的形式存储数据的,你可以把它形象的理解为电子表格“一行一样本,一列一特征”表现形式如下:

image-20230130120706303

假设函数&损失函数

​ 机器学习在构建模型的过程中会应用大量的数学函数,正因为如此很多初学者对此产生畏惧,那么它们真会有这么可怕吗?其实我认为至少没有你想的那么可怕。从编程角度来看,这些函数就相当于模块中内置好的方法,只需要调用相应的方法就可以达成想要的目的。而要说难点,首先你要理解你的应用场景,然后根据实际的场景去调用相应的方法,这才是你更应该关注的问题。

假设函数和损失函数是机器学习中的两个重要概念,它并非某个模块下的函数方法,而是我们根据实际应用场景确定的一种函数形式,就像你解决数学的应用题目一样,根据题意写出解决问题的方程组。下面分别来看一下它们的含义。

1)假设函数

​ 假设函数(Hypothesis Function)可表述为y=f(x)其中X表示输入数据,而y表示输出的预测结果,而这个结果需要不断的优化才会达到预期的结果,否则会与实际值偏差较大。

2)损失函数

损失函数(Loss Function)又叫目标函数,简写为L(x),这里的×是假设函数得出的预测结果“y”,如果L(x)的返回值越大就表示预测结果与实际偏差越大,越小则证明预测值越来越“逼近”真实值,这才是机器学习最终的目的。因此损失函数就像一个度量尺,让你知道“假设函数”预测结果的优劣,从而做出相应的优化策略。

3)优化方法

​ “优化方法”可以理解为假设函数和损失函数之间的沟通桥梁。通过L(x)可以得知假设函数输出的预测结果与实际值的偏差值,当该值较大时就需要对其做出相应的调整,这个调整的过程叫做“参数优化”,而如何实现优化呢?这也是机器学习过程中的难点。其实为了解决这一问题,数学家们早就给出了相应的解决方案,比如梯度下降、牛顿方与拟牛顿法、共轭梯度法等等。因此我们要做的就是理解并掌握“科学巨人”留下的理论、方法。

​ 对于优化方法的选择,我们要根据具体的应用场景来选择应用哪一种最合适,因为每一种方法都有自己的优劣势,所以只有合适的才是最好的。

image-20230130131450039

拟合&过拟合&欠拟合

​ 拟合是机器学习中的重要概念,也可以说,机器学习的研究对象就是让模型能更好的拟合数据,那到底如何理解“拟合”这个词呢?

1)拟合

形象地说,“拟合”就是把平面坐标系中一系列散落的点,用一条光滑的曲线连接起来,因此拟合也被称为“曲线拟合”。拟合的曲线一般用函数进行表示,但是由于拟合曲线会存在许多种连接方式,因此就会出现多种拟合函数。通过研究、比较确定一条最佳的“曲线”也是机器学习中一个重要的任务。如下图所示,展示一条拟合曲线(蓝色曲线):

image-20230130131925145

​ 如何理解拟合,举个例子:上图假设为超市每天的营业额,通过对历史数据拟合出来一条拟合曲线,通过这个拟合曲线去预测未来的营业额。

提示:很多和数学相关的编程语言都内置计算拟合曲线的函数,比如MATLAB、Python Scipy等,在后续内容中还会介绍。

2)过拟合

​ 过拟合(overfitting)与是机器学习模型训练过程中经常遇到的问题,所谓过拟合,通俗来讲就是模型的泛化能力较差,也就是过拟合的模型在训练样本中表现优越,但是在验证数据以及测试数据集中表现不佳。(我在股票预测模型中的表现特别好,每一天都全部都吻合,但是一旦预测股票,天天被割韭菜~)

​ 举一个简单的例子,比如你训练一个识别狗狗照片的模型,如果你只用金毛犬的照片训练,那么该模型就只吸纳了金毛狗的相关特征,此时让训练好的模型识别一只“泰迪犬”,那么结果可想而知,该模型会认为“泰迪”不是一条狗。如下图所示:

image-20230130132526062

过拟合问题在机器学习中经常遇到,主要是因的训练时样本过少,特征值过多导致的,后续还会详细介绍。

3)欠拟合

​ 欠拟合(underfitting)恰好与过拟合相反,它指的是“曲线”不能很好的“拟合”数据。在训练和测试阶段,欠拟合模型表现均较差,无法输出理想的预测结果。如下图所示:

image-20230130132815472

造成欠拟合的主要原因是由于没有选择好合适的特征值,比如使用一次函数(y=kx+b)去拟合具有对数特征值的散落点(y=log2x),示例图如下所示:

image-20230130133000485

欠拟合和过拟合是机器学习中会遇到的问题,这两种情况都不是我期望看到的,因此要避免,关于如何处理类似问题,在后续内容中还会陆续讲解,本节只需要大家熟悉并理解常见的机器学习术语和一些概念即可。

本节需要知道的知识点:

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万是否值得投资?

image-20230130182353546

步骤:

1.设P为价格A为面积,确定P、A间的定量关系。即P=f(A)

2.根据关系预测合理价格。P=f(110)

3.做出判断

问题:如何求出函数P=f(A)

image-20230130183551282

使用线性模型y=ax+b去拟合现有的数据。那么问题就在于如何去寻找a和b。

image-20230130183714673

哪一个a和b比较合适呢?

image-20230130183735239

image-20230130183811541

11.4梯度下降法

​ 梯度下降法是寻找极小值的一种方法。通过向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索,直到在极小点收敛。

image-20230130185303797

梯度下降法案例

image-20230130185336209

image-20230130185354711

逐渐接近极小值点(p=2)

梯度下降法动态图:

线性回归.gif

梯度下降法

重复计算直到收敛

image-20230130185844357

image-20230130190135128

效果展示:

动图.gif

其他线性回归案例

1.百万人口/医生预测平均寿命问题

image-20230130190206041

  1. 年龄预测身高

image-20230130190225251

3.住宅面积预测房价

image-20230130190242180

12.-实战:Sklearn求解线性回归问题

1 实战目标

​ 基于generated_data.csv数据,建立线性回归模型,预测x=3.5对应的y值,评估模型表现。

​ 学会用Sklearn求解线性回归问题,寻找a、b (y = ax + b) 并且评估模型的好坏。

数据如下:

image-20230130190833681

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 打印   y=ax+b
a = lr_model.coef_
b = lr_model.intercept_
print(a,b)


3 评估模型表现

y 与y’的均方误差(MSE):

image-20230130192955968

R方值(R2):

image-20230130193009791

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)


# 画图对比y 与y",可视化模型表现:
from matplotlib import pyplot as plt
plt.figure()
plt.plot(y,y_predict)
plt.show()

y” vs y集中度越高越好(越接近直线分布)

13.-实战: 房价预测模型训练

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的合理房价

2 步骤如下

作业1:

# 加载数据
import pandas as pd
import numpy as np
data = pd.read_csv("usa_housing_price.csv")
data.head()


#数据散点图展示
%matplotlib inline
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(10,10))
 #  subplot(231) 代表两行三列的第一个图
fig1 =plt.subplot(231)
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.linear_model import LinearRegression
LR1 = LinearRegression()
#训练模型
LR1.fit(X,y)

#预测
y_predict_1 = LR1.predict(X)
print(y_predict_1)

#模型评估
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逻辑回归算法

image-20230130205608048

1.2.KNN近邻算法

image-20230130205656331

1.3.决策树

image-20230130205732728

1.4神经网络

image-20230130205821662

2 Logistic回归算法

也许乍一看算法名字,你会认为它是用来解决“回归问题”的算法,但其实它是针对“分类问题”的算法。

2.1逻辑回归介绍

​ Logistic回归算法,又叫做逻辑回归算法,或者LR算法(Logistic Regression)。分类问题同样也可以基于“线性模型”构建。“线性模型”最大的特点就是“直来直去”不会打弯,而我们知道,分类问题的预测结果是“离散的”,即对输出数据的类别做判断。比如将类别预设条件分为“0”类和“1”类(或者“是”或者“否”)那么图像只会在“0”和“1”之间上下起伏,如下图所示:

image-20230130210038922

此时你就可能会有很多疑问,线性回归函数不可能“拟合”上述图像。没错,所以接下来我们要学习另一个线性函数Logistic函数。

​ 注意:在机器学习中,L0gsc函数通常用来解决二元分类问题,也就是涉及两个预设类别的问题,而当类别数量超过两个时就需要使用Softmax函数来解决。

​ 19世纪统计学家皮埃尔·弗朗素瓦~韦吕勒发明了pgsc函数,该通数的叫法有很多,比如在神经网络算法中被称为Sigmoid函数,也有人称它为Logistic曲线。其函数图像如下所示:

image-20230130210245402

image-20230130210300400

​ e称为自然常数,也就是一个因定值的“常量”,e-z是以e为庭、z为变量的指数函数,还可以写为e-x,在编写程序代码时,通常将其写为exp(-x)

​ Logistic函数也称为S型生长曲线,取值范国为(0,1),它可以将一个实数映射到(0,1)的区间,非常适合做二元分类。当Z=0时,该函数的取值为0.5,随着z的增大,对应的函数值将逼近于1;而随着z的减小,其函数值将逼近于0。

​ 对于L0gstc函数而言,坐标轴0是一个有着特殊意义坐标,越靠近0和越远离0会出现两种醒然不同的情况:任何大于0.5的数据都会被划分到“1”种;而小于0.5会被归如到“0”类。因此你可以把L0gstc看做解决二分类问题的分类器。如果想要L0gsc分类器预测准确,那么×的取值距离0越远越好,这样结果值才能无限逼近于0或者1,该函数能够很好的拟合”二分类问题函数图像。

2.2损失函数

逻辑回归的最小损失函数如下:

image-20230130210621757

整理一下:

image-20230130210632256

image-20230130210643933

如何求的最小值?min(J)

还是使用梯度下降法

image-20230130210759589

参考文档:

15.研究生复试项目 直播答疑

1.简历怎么书写?

百度 超级简历: https://www.wondercv.com/

​ 百度飞浆 、百度人工智能

在简历上写了解比特币 区块链的知识

项目时间可以写 : 2021年09月–2021年12月 2022年01月–2022年02月

通过做线性回归汽车预测模型,让我对人工智能更加感兴趣,所以坚定了我要考研的信心,

要是问一些回答不上来的问题:就说 后来就开始准备复试了,暂时还没有了解其他的,想通过读研期间继续深入学习。

该大学是我一直憧憬的大学,希望老师们可以给我一个来该校继续学习的机会, 谢谢老师。

16.研究生复试面试专题

参考: https://www.cnblogs.com/xwxz/p/16069367.html

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 简单又高大上的项目(应付复试的小demo)