首页 > 其他分享 >初识机器学习及机器学习线性拟合的实现

初识机器学习及机器学习线性拟合的实现

时间:2023-07-23 19:55:37浏览次数:30  
标签:机器 int double 学习 初识 拟合 data 乘法

从最小二乘法到机器学习

1,什么是机器学习?

机器学习有下⾯⼏种定义:

机器学习是⼀⻔⼈⼯智能的科学,该领域的主要研究对象是⼈⼯智能,特别是如何在经验学习

中改善具体算法的性能。

机器学习是对能通过经验⾃动改进的计算机算法的研究。

机器学习是⽤数据或以往的经验,以此优化计算机程序的性能标准。

2,最小二乘法

对与成线性的散点数据模型,通过最小二乘法的计算可以得出数据的拟合模型。(数学概论此处不赘述)

但是最小二乘法不可避免的缺点于平均数的易受极端值影响导致拟合模型容易出现过拟合。

注:算法和模型的区别

算法和模型是两个不同的概念,比如在这里的线性拟合中,使用的最小二乘法是算法,而模型是最后的到的关系式,例如y = 2x+4。

 

3,机器学习在数据拟合中的应用

(1) 最小二乘法适用场景通常是拟合数据呈线性时,但是对于非线性数据最小二乘法拟合出的直线通常就不适用于最小二乘法。对此,我们可以用多项式拟合去解决对数据的拟合问题。

(2) 抛开传统的多项式矩阵计算以外,另一种方法同样适用于非线性曲线拟合,也就是机器学习。

(3) 对于多项式y = a1x^n + a2x^(n-1) + a3x^(n-2) + ...... +a(m)x^n , 我们可以通过对系数进行微量的修改,从而使多项式趋近于真实值。

 

以下是对多元最高项为五次的多项式拟合的代码实现:

 

include<iostream>
#include<vector>
#include <chrono>
#include <thread>
#include <iomanip>
using namespace std;
class Coefficient {
public:
    double a;
    double b;
    double c;
    double d;
    double e;
    double f;
};

double f_x(double x,Coefficient &data) {
    double y  = (data.a*x*x*x*x*x)+(data.b*x*x*x*x)+(data.c*x*x*x)+(data.d*x*x)+(data.e*x)+data.f;
    return y;
}

double Compute(vector<double> &x,vector<double> &y,Coefficient &data) {
    double y_pred_h = 0;

    for (int i = 0; i < 100; i++)
    {
        y_pred_h += (y[i] - f_x(x[i], data)) * (y[i] - f_x(x[i], data));
    }
    return y_pred_h;

}
double feedback(int gradient) {
    // 梯度反馈
     return 0.1 / pow(10, gradient);
}

void Com_e(vector<double>& x, vector<double>& y, Coefficient& data) {
    // 5次项计算
    int gradient = 0; // 计算梯度,梯度为0时无决策
    double result_order = 0; // 存储上一次计算结果
    double result_now = 0; // 存储当前计算结果
    int calibration = 0; //校准参数,默认为0
    int aa = 0,kk = 0;
    // 默认最高精度为小数点后6位
    while (1) {
        result_now = Compute(x, y, data);
        
        if (calibration == 0) {
            if (abs((int)(result_now * 1000000) - (int)(result_order * 1000000)) < 0.00000000001) {
                cout << setprecision(15) << "当前e值:" << data.e << endl;
                cout << setprecision(15) << "当前result_order的值:" <<result_order<<",当前result_now的值:" << result_now << endl;
                break;
            }
        }
        if (result_now - result_order > 0 && result_order != 0 ) {
            data.e += feedback(gradient);  // 回溯
            cout << "第"<< aa << "精度调正" << endl;
            this_thread::sleep_for(chrono::milliseconds(300));
            gradient += 1; // 发生回溯后位数精度加1
            calibration = 1;
            aa++;
        }
        data.e -= feedback(gradient);
        cout << "第"<< kk <<"精度校准,当前e值:" << data.e << endl;
        this_thread::sleep_for(chrono::milliseconds(300));
        cout << setprecision(15) << "当前result_order的值:" << result_order << ",当前result_now的值:" << result_now << endl;
        result_order = result_now; // 赋给上一个基准点
        cout << "当前result_order的值:" << result_order << endl;
        calibration = 0;
        kk++;
    }
}

int main() {
    vector<double> x = { 0.0238443, 0.0782814, 0.309722, 0.356379, 0.666561, 0.69018, 0.741007, 1.28952, 1.35156, 1.36749, 1.4039, 1.43163, 1.63053, 1.80123, 2.01043, 2.03856, 2.23708, 2.24379, 2.52274, 2.62696, 2.77726, 2.84281, 2.86952, 2.95086, 3.04979, 3.06172, 3.17244, 3.17664, 3.31864, 3.36358, 3.39419, 3.39652, 3.40442, 3.50581, 3.53935, 3.57435, 3.95945, 4.1482, 4.23497, 4.52956, 4.57167, 4.60112, 4.66563, 4.9201, 4.93874, 4.99603, 5.13926, 5.15358, 5.30797, 5.31045, 5.37438, 5.3793, 5.42455, 5.45504, 5.71962, 5.72462, 5.76174, 5.97731, 6.25061, 6.35035, 6.51578, 6.78054, 6.78656, 6.92455, 7.02385, 7.24099, 7.25993, 7.26249, 7.34808, 7.51587, 7.54976, 7.62619, 7.65725, 7.67294, 7.68242, 7.74679, 7.88493, 8.18776, 8.27934, 8.31393, 8.35422, 8.41552, 8.52648, 8.63434, 8.81657, 8.85457, 8.87774, 8.8978, 9.07313, 9.15527, 9.28593, 9.59358, 9.72242, 9.75149, 9.76268, 9.79195, 9.81805, 9.82021, 9.89382, 9.89629 };
    vector<double> y = { 3.30207, 5.05404, 1.85261, 3.69977, 5.95768, 4.03767, 5.35161, 5.94737, 7.74113, 4.66731, 4.46411, 6.29095, 5.98303, 7.83717, 4.67074, 6.40559, 7.8632, 6.12997, 6.8309, 6.4112, 9.4472, 6.79975, 9.66573, 8.07317, 8.78041, 10.287, 9.53091, 8.78894, 8.56872, 10.7272, 9.16251, 9.2074, 10.5194, 11.8693, 9.43812, 9.88234, 10.1937, 10.0158, 9.53178, 13.1102, 12.2788, 11.7006, 13.4194, 12.3888, 13.1672, 14.0105, 12.5682, 14.0882, 14.2512, 14.3275, 14.7135, 14.1075, 13.2721, 13.4276, 14.2462, 13.0362, 15.8378, 14.8242, 14.8943, 15.1473, 16.0866, 17.7518, 15.9764, 15.5912, 16.9059, 18.3209, 17.9057, 17.7024, 18.8475, 17.8241, 19.6078, 19.5087, 16.9001, 18.634, 18.0884, 19.7081, 20.8486, 19.1761, 19.3259, 18.9728, 18.416, 19.1114, 21.3185, 19.993, 18.6365, 21.3748, 20.4762, 21.1566, 22.031, 20.0275, 20.3419, 19.9408, 23.093, 22.8716, 22.3229, 20.5651, 21.5855, 22.778, 22.5554, 23.0719 };
    Coefficient data;
    data.a = 0.00000001;
    data.b = 0.00000001;
    data.c = 0.00000001;
    data.d = 0.00000001;
    data.e = 2.42014;
    data.f = 0.671964;

    Com_e(x, y, data);

    return 0;
}

 

标签:机器,int,double,学习,初识,拟合,data,乘法
From: https://www.cnblogs.com/kukusuyi/p/17575787.html

相关文章

  • [学习笔记] 倍增 Floyd
    一、朴素Floydfor(inti=1;i<=n;++i){for(intj=1;j<=n;++j){for(intk=1;k<=n;++k){d[i][j]=min(d[i][j],d[i][k]+d[k][j]);}}}二、倍增Floyd/传递闭包要做\(k(\leq10^9)\)次Floyd,怎么办?......
  • GNN学习 GNN Layer(持续更新中)
    GNN学习GNNLayerGNN的通用框架1.对GNN的一个网络层进行信息转换和信息聚合两个操作2.连接GNN的网络层3.图增强,分为图特征增强和图结构增强4.学习目标,有监督学习还是无监督学习,节点/边/图级别1.信息转换和信息聚合GNNLayer=Message+Aggregation不同的实例有不同的信......
  • LSM树学习笔记
    LSM-Tree即logstructuredmergetree。LSM-Tree是许多高度可扩展的NoSQL分布式键值类型数据库(如亚马逊的DynamoDB、Cassandra和ScyllaDB)的基础数据结构。众所周知,这些数据库在设计上支持的写入率远远超过传统关系数据库所能提供的写入率。几乎所有NoSQL数据库都使用LSM树的变体......
  • [c/c++][考研复习笔记]排序篇学习笔记
    考研排序复习笔记插入排序#include<stdio.h>#include<stdlib.h>#defineMaxSize9//折半插入排序voidZBInsertSort(intA[],intn){ inti,j,high,low,mid; for(i=2;i<=n;i++){ A[0]=A[i]; low=1;high=i-1; while(low<=high){ mid=(low+high)/2......
  • PMP 学习笔记(七)
    07.18星期二CPI0.65——成本偏差较大,使用自下而上的估计出现新的干系人,应更新干系人登记册,敏捷方法由产品经理列入待办事项凸显模型适用于复杂的干系人大型社区审查可交付成果,干系人表现出对最终产品的担忧,按时可交付成果有问题,应审查项目需求文件产品不合格,根本原因是开发......
  • Mit 6.824 学习记录
    MapReduce实验干嘛实现一个分布式的MapReduce,由两部分组成,master和worker。一个master,多个worker。在本机运行,worker和master用rpc通信。每个worker向master索要任务,从一个或多个文件读取任务的输入,执行任务,并将任务的输出写入一个或更多文件。如果超时(10s)将工作......
  • 3b1b 线性代数本质 学习笔记
    导航向量基向量特征向量矩阵行列式逆矩阵矩阵与方程组秩满秩列空间零空间核点积叉积基变换向量空间中的箭头\(\vec{v}\)可以自由移动/一般以原点为起点有序的数字列表\(\begin{bmatrix}a\\\vdots\\b\end{bmatrix}\)相加相乘有意义的东西......
  • 记一次crack wifi的测试学习
    为了学习测试下crackwifi,参考了这篇文章:https://www.wikihow.com/Hack-WPA/WPA2-Wi-Fi-with-Kali-Linux (kali)也可以参考:https://gainanov.pro/eng-blog/sysad/wifi-cracking/ (但是jamWifi在较新的macos上已经不能deauthclient了,因此可能要结合别的方法。)中文的资料可以参考......
  • C#学习笔记 —— LINQ
    LINQ1、什么是LINQ使用LINQ可以轻松查询对象集合LINQ代表语言集成查询LINQ是.NET框架的扩展,允许我们使用SQL查询数据库的类似方式来查询数据集合LINQ可以从数据库、对象集合、XML文档中查询数据2、LINQ提供程序对于每一种数据源类型,一定有根据该数据源类型实现LI......
  • Armv8-A 虚拟化学习
    Armv8-A虚拟化参考文献:Armv8-Avirtualization.pdfArm中,常使用的虚拟机监视器有Xen(type1)和KVM(type2)。全虚拟化和半虚拟化全虚拟化是指一般的虚拟机,它可以完全模拟物理机器。但性能差,每次对寄存器的操作都得经过监视器。半虚拟化是为了提升性能的,如GuestOS,它好像运行在一......