diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..4b16f59 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ae945fa --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea/ +venv/ diff --git a/AnomalyDetection/AnomalyDetection.py b/AnomalyDetection/AnomalyDetection.py index 31bfa48..d481dc2 100644 --- a/AnomalyDetection/AnomalyDetection.py +++ b/AnomalyDetection/AnomalyDetection.py @@ -1,6 +1,7 @@ #-*- coding: utf-8 -*- # Author: Bob # Date: 2016.12.22 +from __future__ import print_function import numpy as np from matplotlib import pyplot as plt from scipy import io as spio @@ -15,9 +16,9 @@ def anomalyDetection_example(): plt.show() '''多元高斯分布函数,并可视化拟合的边界''' mu,sigma2 = estimateGaussian(X) # 参数估计(求均值和方差) - #print mu,sigma2 + #print (mu,sigma2) p = multivariateGaussian(X,mu,sigma2) # 多元高斯分布函数 - #print p + #print (p) visualizeFit(X,mu,sigma2) # 显示图像 '''选择异常点(在交叉验证CV上训练得到最好的epsilon)''' @@ -25,8 +26,8 @@ def anomalyDetection_example(): yval = data['yval'] # y=1代表异常 pval = multivariateGaussian(Xval, mu, sigma2) # 计算CV上的概率密度值 epsilon,F1 = selectThreshold(yval,pval) # 选择最优的epsilon临界值 - print u'在CV上得到的最好的epsilon是:%e'%epsilon - print u'对应的F1Score值为:%f'%F1 + print(u'在CV上得到的最好的epsilon是:%e'%epsilon) + print(u'对应的F1Score值为:%f'%F1) outliers = np.where(p1D,nD-->kD](#2-2d-1dnd-kd) - * [3、主成分分析PCA与线性回归的区别](#3-主成分分析pca与线性回归的区别) - * [4、PCA降维过程](#4-pca降维过程) - * [5、数据恢复](#5-数据恢复) - * [6、主成分个数的选择(即要降的维度)](#6-主成分个数的选择即要降的维度) - * [7、使用建议](#7-使用建议) - * [8、运行结果](#8-运行结果) - * [9、使用scikit-learn库中的PCA实现降维](#9-使用scikit-learn库中的pca实现降维) - * [七、异常检测 Anomaly Detection](#七-异常检测-anomaly-detection) - * [1、高斯分布(正态分布)](#1-高斯分布正态分布) - * [2、异常检测算法](#2-异常检测算法) - * [3、评价的好坏,以及的选取](#3-评价的好坏以及的选取) - * [4、选择使用什么样的feature(单元高斯分布)](#4-选择使用什么样的feature单元高斯分布) - * [5、多元高斯分布](#5-多元高斯分布) - * [6、单元和多元高斯分布特点](#6-单元和多元高斯分布特点) - * [7、程序运行结果](#7-程序运行结果) + * [1、随机显示100个数字](#1随机显示100个数字) + * [2、OneVsAll](#2onevsall) + * [3、手写数字识别](#3手写数字识别) + * [4、预测](#4预测) + * [5、运行结果](#5运行结果) + * [6、使用scikit-learn库中的逻辑回归模型实现](#6使用scikit-learn库中的逻辑回归模型实现) + * [三、BP神经网络](#三bp神经网络) + * [1、神经网络model](#1神经网络model) + * [2、代价函数](#2代价函数) + * [3、正则化](#3正则化) + * [4、反向传播BP](#4反向传播bp) + * [5、BP可以求梯度的原因](#5bp可以求梯度的原因) + * [6、梯度检查](#6梯度检查) + * [7、权重的随机初始化](#7权重的随机初始化) + * [8、预测](#8预测) + * [9、输出结果](#9输出结果) + * [四、SVM支持向量机](#四svm支持向量机) + * [1、代价函数](#1代价函数) + * [2、Large Margin](#2large-margin) + * [3、SVM Kernel(核函数)](#3svm-kernel核函数) + * [4、使用中的模型代码](#4使用scikit-learn中的svm模型代码) + * [5、运行结果](#5运行结果) + * [五、K-Means聚类算法](#五k-means聚类算法) + * [1、聚类过程](#1聚类过程) + * [2、目标函数](#2目标函数) + * [3、聚类中心的选择](#3聚类中心的选择) + * [4、聚类个数K的选择](#4聚类个数k的选择) + * [5、应用——图片压缩](#5应用图片压缩) + * [6、使用scikit-learn库中的线性模型实现聚类](#6使用scikit-learn库中的线性模型实现聚类) + * [7、运行结果](#7运行结果) + * [六、PCA主成分分析(降维)](#六pca主成分分析降维) + * [1、用处](#1用处) + * [2、2D-->1D,nD-->kD](#22d--1dnd--kd) + * [3、主成分分析PCA与线性回归的区别](#3主成分分析pca与线性回归的区别) + * [4、PCA降维过程](#4pca降维过程) + * [5、数据恢复](#5数据恢复) + * [6、主成分个数的选择(即要降的维度)](#6主成分个数的选择即要降的维度) + * [7、使用建议](#7使用建议) + * [8、运行结果](#8运行结果) + * [9、使用scikit-learn库中的PCA实现降维](#9使用scikit-learn库中的pca实现降维) + * [七、异常检测 Anomaly Detection](#七异常检测-anomaly-detection) + * [1、高斯分布(正态分布)](#1高斯分布正态分布gaussian-distribution) + * [2、异常检测算法](#2异常检测算法) + * [3、评价的好坏,以及的选取](#3评价px的好坏以及ε的选取) + * [4、选择使用什么样的feature(单元高斯分布)](#4选择使用什么样的feature单元高斯分布) + * [5、多元高斯分布](#5多元高斯分布) + * [6、单元和多元高斯分布特点](#6单元和多元高斯分布特点) + * [7、程序运行结果](#7程序运行结果) ## 一、[线性回归](/LinearRegression) - [全部代码](/LinearRegression/LinearRegression.py) @@ -105,7 +104,7 @@ def computerCost(X,y,theta): - 假设函数`f(x)` - 泰勒展开:`f(x+△x)=f(x)+f'(x)*△x+o(△x)` - 令:`△x=-α*f'(x)` ,即负梯度方向乘以一个很小的步长`α` - - 将`△x`代入泰勒展开式中:`f(x+x)=f(x)-α*[f'(x)]²+o(△x)` + - 将`△x`代入泰勒展开式中:`f(x+△x)=f(x)-α*[f'(x)]²+o(△x)` - 可以看出,`α`是取得很小的正数,`[f'(x)]²`也是正数,所以可以得出:`f(x+△x)<=f(x)` - 所以沿着**负梯度**放下,函数在减小,多维情况一样。 - 实现代码 @@ -313,7 +312,6 @@ import numpy as np ``` # 归一化 scaler = StandardScaler() - scaler.fit(x_train) x_train = scaler.fit_transform(x_train) x_test = scaler.fit_transform(x_test) ``` @@ -547,7 +545,7 @@ def nnCostFunction(nn_params,input_layer_size,hidden_layer_size,num_labels,X,y,L - ![{\delta ^{(3)}} = {({\theta ^{(3)}})^T}{\delta ^{(4)}}.*{g^}({a^{(3)}})](http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7B%5Cdelta%20%5E%7B%283%29%7D%7D%20%3D%20%7B%28%7B%5Ctheta%20%5E%7B%283%29%7D%7D%29%5ET%7D%7B%5Cdelta%20%5E%7B%284%29%7D%7D.%2A%7Bg%5E%7D%28%7Ba%5E%7B%283%29%7D%7D%29) - ![{\delta ^{(2)}} = {({\theta ^{(2)}})^T}{\delta ^{(3)}}.*{g^}({a^{(2)}})](http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7B%5Cdelta%20%5E%7B%282%29%7D%7D%20%3D%20%7B%28%7B%5Ctheta%20%5E%7B%282%29%7D%7D%29%5ET%7D%7B%5Cdelta%20%5E%7B%283%29%7D%7D.%2A%7Bg%5E%7D%28%7Ba%5E%7B%282%29%7D%7D%29) - 没有![{\delta ^{(1)}}](http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7B%5Cdelta%20%5E%7B%281%29%7D%7D),因为对于输入没有误差 -- 因为S型函数![{\text{g(z)}}](http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7B%5Ctext%7Bg%28z%29%7D%7D)的倒数为:![{g^}(z){\text{ = g(z)(1 - g(z))}}](http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7Bg%5E%7D%28z%29%7B%5Ctext%7B%20%3D%20g%28z%29%281%20-%20g%28z%29%29%7D%7D),所以上面的![{g^}({a^{(3)}})](http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7Bg%5E%7D%28%7Ba%5E%7B%283%29%7D%7D%29)和![{g^}({a^{(2)}})](http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7Bg%5E%7D%28%7Ba%5E%7B%282%29%7D%7D%29)可以在前向传播中计算出来 +- 因为S型函数![{\text{g(z)}}](http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7B%5Ctext%7Bg%28z%29%7D%7D)的导数为:![{g^}(z){\text{ = g(z)(1 - g(z))}}](http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7Bg%5E%7D%28z%29%7B%5Ctext%7B%20%3D%20g%28z%29%281%20-%20g%28z%29%29%7D%7D),所以上面的![{g^}({a^{(3)}})](http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7Bg%5E%7D%28%7Ba%5E%7B%283%29%7D%7D%29)和![{g^}({a^{(2)}})](http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7Bg%5E%7D%28%7Ba%5E%7B%282%29%7D%7D%29)可以在前向传播中计算出来 - 反向传播计算梯度的过程为: - ![\Delta _{ij}^{(l)} = 0](http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%5CDelta%20_%7Bij%7D%5E%7B%28l%29%7D%20%3D%200)(![\Delta ](http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%5CDelta%20)是大写的![\delta ](http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%5Cdelta%20)) @@ -565,8 +563,8 @@ def nnCostFunction(nn_params,input_layer_size,hidden_layer_size,num_labels,X,y,L # 梯度 def nnGradient(nn_params,input_layer_size,hidden_layer_size,num_labels,X,y,Lambda): length = nn_params.shape[0] - Theta1 = nn_params[0:hidden_layer_size*(input_layer_size+1)].reshape(hidden_layer_size,input_layer_size+1) - Theta2 = nn_params[hidden_layer_size*(input_layer_size+1):length].reshape(num_labels,hidden_layer_size+1) + Theta1 = nn_params[0:hidden_layer_size*(input_layer_size+1)].reshape(hidden_layer_size,input_layer_size+1).copy() # 这里使用copy函数,否则下面修改Theta的值,nn_params也会一起修改 + Theta2 = nn_params[hidden_layer_size*(input_layer_size+1):length].reshape(num_labels,hidden_layer_size+1).copy() m = X.shape[0] class_y = np.zeros((m,num_labels)) # 数据的y对应0-9,需要映射为0/1的关系 # 映射y @@ -581,9 +579,8 @@ def nnGradient(nn_params,input_layer_size,hidden_layer_size,num_labels,X,y,Lambd Theta1_grad = np.zeros((Theta1.shape)) #第一层到第二层的权重 Theta2_grad = np.zeros((Theta2.shape)) #第二层到第三层的权重 - - Theta1[:,0] = 0; - Theta2[:,0] = 0; + + '''正向传播,每次需要补上一列1的偏置bias''' a1 = np.hstack((np.ones((m,1)),X)) z2 = np.dot(a1,np.transpose(Theta1)) @@ -592,15 +589,19 @@ def nnGradient(nn_params,input_layer_size,hidden_layer_size,num_labels,X,y,Lambd z3 = np.dot(a2,np.transpose(Theta2)) h = sigmoid(z3) + '''反向传播,delta为误差,''' delta3 = np.zeros((m,num_labels)) delta2 = np.zeros((m,hidden_layer_size)) for i in range(m): - delta3[i,:] = h[i,:]-class_y[i,:] + #delta3[i,:] = (h[i,:]-class_y[i,:])*sigmoidGradient(z3[i,:]) # 均方误差的误差率 + delta3[i,:] = h[i,:]-class_y[i,:] # 交叉熵误差率 Theta2_grad = Theta2_grad+np.dot(np.transpose(delta3[i,:].reshape(1,-1)),a2[i,:].reshape(1,-1)) delta2[i,:] = np.dot(delta3[i,:].reshape(1,-1),Theta2_x)*sigmoidGradient(z2[i,:]) Theta1_grad = Theta1_grad+np.dot(np.transpose(delta2[i,:].reshape(1,-1)),a1[i,:].reshape(1,-1)) + Theta1[:,0] = 0 + Theta2[:,0] = 0 '''梯度''' grad = (np.vstack((Theta1_grad.reshape(-1,1),Theta2_grad.reshape(-1,1)))+Lambda*np.vstack((Theta1.reshape(-1,1),Theta2.reshape(-1,1))))/m return np.ravel(grad) @@ -1158,9 +1159,9 @@ def selectThreshold(yval,pval): '''计算''' for epsilon in np.arange(np.min(pval),np.max(pval),step): cvPrecision = pval