From f2af7c49f3cc0554e2f6551f45fa6bcd32fa058f Mon Sep 17 00:00:00 2001 From: haotian <2421912570@qq.com> Date: Wed, 5 Feb 2025 11:29:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90--=E7=BA=BF=E6=80=A7=E5=9B=9E?= =?UTF-8?q?=E5=BD=92=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ml.md | 64 ++++++++++++++++++++++++++++++++++++++++++++++ linear.py | 44 +++++++++++++++++++++++++++++++ output/linear.png | Bin 0 -> 18623 bytes 3 files changed, 108 insertions(+) create mode 100644 docs/ml.md create mode 100644 linear.py create mode 100644 output/linear.png diff --git a/docs/ml.md b/docs/ml.md new file mode 100644 index 0000000..efadbd2 --- /dev/null +++ b/docs/ml.md @@ -0,0 +1,64 @@ +深度学习与机器学习分类 + 1.监督学习: + 分类:将输入数据分配到预定义的类别中,如图像分类,文本分类 + 回归:预测连续值,如房价预测,股票价格预测. + 2.无监督学习: + 聚类:将数据分组,如客户细分,图像分割. + 降维:减少数据维度,如PCA,t-SNE + 3.半监督学习:结合少量标注数据和大量未标注数据进行训练. + 4.强化学习:通过与环境交互学习策略,如游戏AI,机器人控制. + 5.生成模型: + 生成对抗网络(GANS):生成逼真数据,如图像生成,视频生成. + 扩散模型:同上 + 自编码器:学习数据表示,用于数据压缩,去噪. + +机器学习主要算法 + 1.监督学习算法 + 1.线性回归:用于回归任务,通过线性方程预测连续值. + 2.逻辑回归:用于分类任务,通过逻辑函数预测类别概率 + 3.支持向量机(SVM):用于分类和回归,通过找到最优超平面分离数据. + 4.决策树:用于分类和回归,通过树结构进行决策. + 5.随机森林:集成学习方法,通过多个决策树提高性能. + 6.K近邻(KNN):基于距离度量,通过最近邻样本进行预测. + 7.朴素贝叶斯:基于贝叶斯定理,适用于文本分类等任务. + 8.AdaBoost:集成学习算法,通过加权多个若分类器提高性能. + 9.梯度提升树(GBM):通过逐步优化残差进行预测. + 10.XGBoost:GBM的高效实现. + 11.LightGBM:另一种高效的GBM实现,适用于大规模数据. + 2.无监督学习 + 1.K均值聚类 + 2.层次聚类: + 3.主成分分析(PCA):用于降维,通过线性变换保留主要特征 + 4.t-SNE:用于高维数据可视化,保留局部结构. + 5.自组织映射(SOM):通过神经网络进行数据降维和可视化. + 6.高斯混合模型(GMM):通过多个高斯分布拟合数据. + +机器学习算法具体介绍 + 1.线性回归: 用于建模输入变量(自变量)与输出变量(因变量)之间线性关系的统计方法. + 原理: + y=β0​+β1​x1​+β2​x2​+⋯+βn​xn​+ϵ + + ϵ误差项,表示模型未能解释的部分 + 目标: 最小化误差项的平方和(最小二乘法)来估计系数 + L(β)=i=1∑m​(yi​−(β0​+β1​xi1​+β2​xi2​+⋯+βn​xin​))2 + 适用场景: + 1.连续值预测: + 房价预测 + 股票价格预测 + 销售额预测:根据广告投入,市场条件等预测销售额. + 2.因果关系分析: + 经济学:分析政策变化对经济指标的影响. + 医学:研究药物剂量对治疗效果的影响. + 3.简单建模: + 初步分析:在复杂模型之前,使用线性回归进行初步数据分析. + 解释性模型:模型回归模型易于解释,适合需要透明度的场景 + + 优缺点: + 优点: + 简单易懂:模型结构简单,易于理解和实现。 + 计算高效:训练和预测速度快,适用于大规模数据。 + 解释性强:系数直接反映自变量对因变量的影响。 + 缺点: + 线性假设:假设自变量和因变量之间存在线性关系,可能不适用于非线性数据。 + 对异常值敏感:异常值可能对模型产生较大影响。 + 多重共线性:自变量之间高度相关时,模型表现可能不佳。 \ No newline at end of file diff --git a/linear.py b/linear.py new file mode 100644 index 0000000..5018f74 --- /dev/null +++ b/linear.py @@ -0,0 +1,44 @@ +''' + 线性回归 +''' + +import numpy as np +import matplotlib.pyplot as plt +from sklearn.model_selection import train_test_split +from sklearn.linear_model import LinearRegression +from sklearn.metrics import mean_squared_error, r2_score + +# 生成示例数据 +# 假设我们有一些数据点 (X, y),其中 X 是输入特征,y 是目标变量 +# 设置随机种子, 不然每次运行程序结果都不一样 +np.random.seed(0) +X = 2 * np.random.rand(100, 1) +y = 4 + 3 * X + np.random.randn(100, 1) + +# 将数据分为训练集和测试集 +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) + +# 创建线性回归模型 +model = LinearRegression() + +# 训练模型 +model.fit(X_train, y_train) + +# 使用模型进行预测 +y_pred = model.predict(X_test) + +# 评估模型 +mse = mean_squared_error(y_test, y_pred) +r2 = r2_score(y_test, y_pred) + +print(f"Mean Squared Error: {mse}") +print(f"R^2 Score: {r2}") + +# 可视化结果 +plt.scatter(X_test, y_test, color='black', label='Actual data') +plt.plot(X_test, y_pred, color='blue', linewidth=3, label='Fitted line') +plt.xlabel('X') +plt.ylabel('y') +plt.legend() + +plt.savefig('./output/linear.png') diff --git a/output/linear.png b/output/linear.png new file mode 100644 index 0000000000000000000000000000000000000000..2b64b367bc6a67b00f2d938e42e3396b373c9e73 GIT binary patch literal 18623 zcmeIaXHZmY*Dbop7zpB45F{ud+pU0P1PO`~1q2i%gGkOf2{ej|3ZkGOAfS>YBRMr$ zPytC28)$-(n9y-oe9^U3|mWaB!hl_)=hlA}ME-yDu1s(r$n1HjJwII(kMmadu0T*R`cLZTDNB<}L zD3@-FAj)S{u3o7r#_id`1 z`F4i(_S#uFdv;VY$5*q&IxCppdy$VMuZGO93COG2x2Dk|9|BFc*W8ziVlTZ)6vllmN>>& zc+Q<^DfnPak07-7g%pd6i@$yOa^o@m`urhoq@q2xisQm5D5GhtpQ zv@RnKkDZ1qRF*m9Gcq!?a^csM$!Ted0x>P#9HrdkX40bcJ85ZYOz?_AMZBu-wIovD z(HE%r-(R2$o!Ofc79P_br+hCZ+Qi(ab(cIj+y5y!Cr^kBX*@%2#=0igh%%wzW6cE}J$&gQv5tcJF^e1m9C_FF{h^g?HVIsIOQYA=x>!xcY6#1@Lp_e;* z_H3uX0R&OGPJTezFJL|#FNbg)clCl;L<4X9sinR_nTvV6NmNu+a(#V${tpU7{?cjW zgMLelU`)eU$L7)mjx?B^eg4?7V-Kr8(w^n#e{HEhi1qg_QX@mS&NGQ40){2mnN57& z3kwU!5yXU>rb}>6I(~i?Qr-*MoykgbS$Wk@H9qAm`ds>lpTDQdcjcym0qduo1K$&6 z3~Tn*@`@b>gdK4u{HK!+AQ&FP0Qc~{!qvhgmAon@f*q4iJ$0>&|GG_ozPaD@`^Rws zdx`!FofHh0-YIbg+&rh3d$TXsSj?)Gg@CV-tAAb6O7J>&?wneAd3oF=-vT#x_t&pq z^OoY+d)srevbx>dWzy~Qu(}h?5q(4D?(s#wTfbt~c8Nizuu`)0$lWv<(d66vJ6lBV@Nf zsuvRn3YGMXTpvEaILVTlo<3K-vtZvfnUS8@b;A1XdkC`(XM8n!YbDNj0hR6TxxCl$ z@#j=#JCh%uZ|N$s?dDN=cAUR!z&a^sVYqUx-y))iirMI$dc1gXhAbjKw@{`aHOVrw zP?^e?_(GuSh941Yqxaee-otY?2@UUI<fsC%>~KfB0~E*l#W;?t=OKNA&EOL8J*z z*dd1Td4h+SOK~|Q(!EzqD*?M}ebq0f+{#zSp9!i)iaYeb%gp@e7&Eil@}m|ur?ShO_ZEYr&+C7nXP27( z@Jv8kK|!HojSPv~_{tY)snVS;5wP%p;k2n{y@)v1*YmgYYd2QX)Z@c=3a#2$YrNz( z>lj+s`b;@jcXaji*i_OgDk{FZ@2nF<=KAs^;7@yZ>|=U%VU6@|WxI8A{b<*6qsfl< z3XXw9v#^sFyZ$%U7EdJvoLF;jCh+k>r8j^-Kd&Rie(!gdEklVP}`=yeZYcjUam*e#)vE(X#th zzr@`ql^@V3<({cD<9#9i=AwI=Q_b#revn3fLz?3W6S`iwH&4j5mUr)NmYlG7_4aKx znoCsG)O4o4C*Vlc>{1?!Y>LrU3ZEXwOL=B`EevIhkKeJhvij%ZMSX6?unxG{=T6pf zpRC(C!cT}OS~P`qinL!!9>MzCw?y-^idbE*Z7*M}KlC~_HiIwG=gNr_C+uu&I?krQ zW$M~SYU#xtBQ-94S`&Xjqh{ZydOnqdqhy|J9#@*j;~ddFR=vA!h<9%*{}pX`)7Y5c z?=V~;c76>K!s8<2e2Cr@bVF7Ut9OdL2nP6xi3mAeMa4&xZSj06tWq8yA;!DLcX)Vt z#bR@Ypk4&5v`GY>av=;B2Re@U6J?BpcGsl#Nh@M^zcBLh@y+4)_q;pS7+5aICrEjA zeS3W_0Ov&*Ockslb#1ILo8Eg50cO{mt^e)&_uhAxAKW`CPoHNRiI<%pD%W8Xcj(9| z9m#~3tn`3}0p54z{aiYP%lA^(N3Gxn{9tj{_F71dOMxXakFTlOUMI{k-?6i^D{}j# z8qOm0;d39{!8tLp9^w)Dfq?-xsf6kiMM?$d)dXVH;NPcqhxAN*uT^>xx^C$ir|M{2 z{7hV$;N0(*ID9E!+XE7M?CtK9 z&fM8`Q70E_dIPVk^LDi5`4&52vc`h*E078~dUi@C?;jGl0IL*O*q&ol-lZ(e8ASS& zSKX~4-3DfTuGPP z{p!s01&Zh0?~)UTqaq{kXh_ZQtkfS86pg*{LHA5B%fv3$)N8;pO)W+s4HC#C6kMTX z#qi~L%H{dO_Ba3oQE%TmD2B0^?`^dQiO2rs(ai4sraEAUwWXl-M}|(gP}6yns{X?q zm->15_{%%Jva84vlo`^J3$)2FXuV!Uq>pL{v^*%d*SzOc;j$-PunHE`Zo zsO-|Wz6MAyC!vOL+ML3SCqx=i9hvL+_U#*5)>ck;yCu#U!wY=@{!Jl=H}*6JFVl>e-6K% zBmg-0mR{-57tgtO!=UQ+Y)6wonvK8%J0)PLhQ8f{`b21p9faW^dbGKRUG-F1Vb#cSk?ki#WpmavR}#8L;-+ zdtA{zXkAn0mXwQp#roiSP-4T_4OiDsJYole!{wNd9dnhdWjuw{w*w@)tFIf?+!W6C z%d7JDW*xM$w9NSU@e6S+_==%q_{odf0IMPOKl?UCA%A+&C#A4Gnmi|L`zzmwQo6?b zoq5<8uV20TXj&5(h)d8&2grS!S}dfDno&KBU0T4Wz4G{cET^=5PGE*1h}M+O*Vh*S75TZ~kP|YPBV8R_g#IH~B?X1W;xl}FSpe(; zBbs<;SRZ5D-P}+JzB?&Vv$Vz(9UVRU?OfhXPtRg!T-XT_9u=s?6-!NQJ$a^bo`k_$ z4UZZ0Y;7~}P`ae`Am3C0oCkPQp)Bpa;Lz=T?+h4W7~=c@O04`}Al{MP@;BEFSt z2Z!HFgCCva<-PWRny#yXL2f9moeJZlr$58K;K)x}o8cx5935Hg`?&O0#I}nE-V)

_@_dw_6(WSy?`|I25irLI8QTNH~>Te~r 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 vNXlcHQK1fDBLDN