如何用Python实现常见机器学习算法-1

最近在GitHub上学习了有关python实现常见机器学习算法

目录

  • 一、线性回归

    1、代价函数

    2、梯度下降算法

    3、均值归一化

    4、最终运行结果

    5、使用scikit-learn库中的线性模型实现

  • 二、逻辑回归

    1、代价函数

    2、梯度

    3、正则化

    4、S型函数

    5、映射为多项式

    6、使用的优化方法

    7、运行结果

    8、使用scikit-learn库中的逻辑回归模型实现

  • 逻辑回归_手写数字识别_OneVsAll

    1、随机显示100个数字

    2、OneVsAll

    3、手写数字识别

    4、预测

    5、运行结果

    6、使用scikit-learn库中的逻辑回归模型实现

  • 三、BP神经网络

    1、神经网络model

    2、代价函数

    3、正则化

    4、反向传播BP

    5、BP可以求梯度的原因

    6、梯度检查

    7、权重的随机初始化

    8、预测

    9、输出结果

  • 四、SVM支持向量机

    1、代价函数

    2、Large Margin

    3、SVM Kernel

    4、使用中的模型代码

    5、运行结果

  • 五、K-Mearns聚类算法

    1、聚类过程

    2、目标函数

    3、聚类中心的选择

    4、聚类个数K的选择

    5、应用——图片压缩

    6、使用scikit-learn库中的线性模型实现聚类

    7、运行结果

  • 六、PCA主成分分析(降维)

    1、用处

    2、2D-->1D,nD-->kD

    3、主成分分析PCA与线性回归的区别

    4、PCA降维过程

    5、数据恢复

    6、主成分个数的选择(即要降的维度)

    7、使用建议

    8、运行结果

    9、使用scikit-learn库中的PCA实现降维

  • 七、异常检测Anomaly Detection

    1、高斯分布(正态分布)

    2、异常检测算法

    3、评价的好坏,以及的选取

    4、选择使用什么样的feature(单位高斯分布)

    5、多元高斯分布

    6、单元和多元高斯分布特点

    7、程序运行结果

一、线性回归

1、代价函数

其中

下面就是求出theta,使代价最小,即代表我们拟合出来的方程距离真实值最近共有m条数据,其中代表我们拟合出来的方程到真实值距离的平方,平方的原因是因为可能有负值,系数2的原因是下面求梯度是对每个变量求偏导,2可以消去。

代码实现:

1 # 计算代价函数
2 def computerCost(X,y,theta):
3     m = len(y)
4     J = 0
5     J = (np.transpose(X*theta-y))*(X*theta-y)/(2*m) #计算代价J
6     return J

注意这里的X是真实数据前加了一列1,因为有theta(0)

2、梯度下降算法

代价函数对求偏导得到:

所以对theta的更新可以写成:

其中为学习速率,控制梯度下降的速度,一般取0.01,0.03,0.1,0.3......

为什么梯度下降可以逐步减小代价函数?

假设函数f(x)的泰勒展开:f(x+△x)=f(x)+f‘(x)*△x+o(△x),令:△x=-α*f‘(x),即负梯度方向乘以一个很小的步长α,将△x带入泰勒展开式中:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px "Helvetica Neue"; color: #3f3f3f; background-color: #ffffff }
span.s1 { }

f(x+x)=f(x)-α*[f‘(x)]2+o(△x)

可以看出,α是取得很小的正数,[f‘(x)]2也是正数,所以可以得出f(x+△x)<=f(x),所以沿着负梯度放下,函数在减小,多维情况一样。

 1 # 梯度下降算法
 2 def gradientDescent(X,y,theta,alpha,num_iters):
 3     m = len(y)
 4     n = len(theta)
 5     temp = np.matrix(np.zeros((n,num_iters)))   # 暂存每次迭代计算的theta,转化为矩阵形式
 6     J_history = np.zeros((num_iters,1)) #记录每次迭代计算的代价值
 7
 8     for i in range(num_iters):  # 遍历迭代次数
 9         h = np.dot(X,theta)     # 计算内积,matrix可以直接乘
10         temp[:,i] = theta - ((alpha/m)*(np.dot(np.transpose(X),h-y)))   #梯度的计算
11         theta = temp[:,i]
12         J_history[i] = computerCost(X,y,theta)      #调用计算代价函数
13         print ‘.‘,
14     return theta,J_history

3、均值归一化

均值归一化的目的是使数据都缩放到一个范围内,便于使用梯度下降算法

其中为所有此feature数据的平均值,可以为此feature的最大值减去最小值,也可以为这个feature对应的数据的标准差。

代码实现:

 1 # 归一化feature
 2 def featureNormaliza(X):
 3     X_norm = np.array(X)            #将X转化为numpy数组对象,才可以进行矩阵的运算
 4     #定义所需变量
 5     mu = np.zeros((1,X.shape[1]))
 6     sigma = np.zeros((1,X.shape[1]))
 7
 8     mu = np.mean(X_norm,0)          # 求每一列的平均值(0指定为列,1代表行)
 9     sigma = np.std(X_norm,0)        # 求每一列的标准差
10     for i in range(X.shape[1]):     # 遍历列
11         X_norm[:,i] = (X_norm[:,i]-mu[i])/sigma[i]  # 归一化
12
13     return X_norm,mu,sigma

注意预测的时候也需要均值归一化数据

4、最终运行结果

代价随迭代次数的变化

5、使用scikit-learn库中的线性模型实现

 1 #-*- coding: utf-8 -*-
 2 import numpy as np
 3 from sklearn import linear_model
 4 from sklearn.preprocessing import StandardScaler    #引入归一化的包
 5
 6 def linearRegression():
 7     print u"加载数据...\n"
 8     data = loadtxtAndcsv_data("data.txt",",",np.float64)  #读取数据
 9     X = np.array(data[:,0:-1],dtype=np.float64)      # X对应0到倒数第2列
10     y = np.array(data[:,-1],dtype=np.float64)        # y对应最后一列
11
12     # 归一化操作
13     scaler = StandardScaler()
14     scaler.fit(X)
15     x_train = scaler.transform(X)
16     x_test = scaler.transform(np.array([1650,3]))
17
18     # 线性模型拟合
19     model = linear_model.LinearRegression()
20     model.fit(x_train, y)
21
22     #预测结果
23     result = model.predict(x_test)
24     print model.coef_       # Coefficient of the features 决策函数中的特征系数
25     print model.intercept_  # 又名bias偏置,若设置为False,则为0
26     print result            # 预测结果
27
28
29 # 加载txt和csv文件
30 def loadtxtAndcsv_data(fileName,split,dataType):
31     return np.loadtxt(fileName,delimiter=split,dtype=dataType)
32
33 # 加载npy文件
34 def loadnpy_data(fileName):
35     return np.load(fileName)
36
37
38 if __name__ == "__main__":
39     linearRegression()

p.p1 { margin: 0.0px 0.0px 8.0px 8.0px; text-align: justify; text-indent: -8.0px; font: 15.0px "Helvetica Neue"; color: #3f3f3f; background-color: #ffffff }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 8.0px 8.0px; text-align: justify; text-indent: -8.0px; font: 15.0px "Helvetica Neue"; color: #3f3f3f; background-color: #ffffff }
span.s1 { }

时间: 2024-07-30 06:11:20

如何用Python实现常见机器学习算法-1的相关文章

如何用Python实现常见机器学习算法-2

二.逻辑回归 1.代价函数 可以将上式综合起来为: 其中: 为什么不用线性回归的代价函数表示呢?因为线性回归的代价函数可能是非凸的,对于分类问题,使用梯度下降很难得到最小值,上面的代价函数是凸函数的图像如下,即y=1时: 可以看出,当趋于1,y=1,与预测值一致,此时付出的代价cost趋于0,若趋于0,y=1,此时的代价cost值非常大,我们最终的目的是最小化代价值,同理的图像如下(y=0): 2.梯度 同样对代价函数求偏导: 可以看出与线性回归的偏导数一致. 推导过程: 3.正则化 正则化的目

如何用Python实现常见机器学习算法-3

三.BP神经网络 1.神经网络模型 首先介绍三层神经网络,如下图 输入层(input layer)有三个units(为补上的bias,通常设为1) 表示第j层的第i个激励,也称为单元unit 为第j层到第j+1层映射的权重矩阵,就是每条边的权重 所以可以得到: 隐含层: 输出层: 其中,S型函数,也成为激励函数 可以看出为3??4的矩阵,为1??4的矩阵 ==>j+1的单元数x(j层的单元数+1) 2.代价函数 假设最后输出的,即代表输出层有K个单元 其中,代表第i个单元输出与逻辑回归的代价函数

8种常见机器学习算法比较

机器学习算法太多了,分类.回归.聚类.推荐.图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中,我们一般都是采用启发式学习方式来实验.通常最开始我们都会选择大家普遍认同的算法,诸如SVM,GBDT,Adaboost,现在深度学习很火热,神经网络也是一个不错的选择.假如你在乎精度(accuracy)的话,最好的方法就是通过交叉验证(cross-validation)对各个算法一个个地进行测试,进行比较,然后调整参数确保每个算法达到最优解,最后选择最好的一个.但是如果你只是在寻找一个

(转)8种常见机器学习算法比较

机器学习算法太多了,分类.回归.聚类.推荐.图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中,我们一般都是采用启发式学习方式来实验.通常最开始我们都会选择大家普遍认同的算法,诸如SVM,GBDT,Adaboost,现在深度学习很火热,神经网络也是一个不错的选择.假如你在乎精度(accuracy)的话,最好的方法就是通过交叉验证(cross-validation)对各个算法一个个地进行测试,进行比较,然后调整参数确保每个算法达到最优解,最后选择最好的一个.但是如果你只是在寻找一个

常见机器学习算法原理+实践系列5(KNN分类+Keans聚类)

一,KNN分类 K-Nearest Neighbor K临近算法是一种有监督的分类算法,工作原理很简单,存在一个样本集合,也成为训练样本,样本中包含标签,将新数据的每个特征与样本集合的数据对应特征进行比较,然后提取样本最相似的分类标签,k就是选择的最相似的数据点,选择k个点中出现频率最高的分类,就是新数据的分类.一般来说k不会超过20个.Knn有两个细节需要注意,一个是相似度算法,常用包含欧式距离,余弦距离等等,另外一个在计算相似度之前需要归一化特征,比如使用离差标准化(Min-Max),把所有

常见机器学习算法原理+实践系列2(SVD)

SVD奇异值分解 利用Singular Value Decomposition 奇异值分解,我们能够用小得多的数据集来表示原始数据集,可以理解为了去除噪音以及冗余信息.假设A是一个m*n的矩阵,通过SVD分解可以把A分解为以下三个矩阵: 其中U为m*m矩阵,里面的向量是正交的,U里面的向量称为左奇异向量,Σ是一个m*n对角矩阵,对角线以外的因素都是0,对角线都是奇异值,按照大到小排序,而VT(V的转置)是一个N * N的矩阵,里面的向量也是正交的,V里面的向量称为右奇异向量).那么奇异值和特征值

常见机器学习算法原理+实践系列6(朴素贝叶斯分类)

朴素贝叶斯NB Native Bayes是一种简单有效的分类算法, 贝叶斯定律用这个条件概率公式来表示: P(A|B) = P(B|A)* P(A) / P(B),其中P(A|B)的意思是,在B发生的前提下,发生A的概率,P(A),P(B)代表现实中发生A以及B的概率,实际上取决于我们输入样本的情况.贝叶斯分类算法在邮件分类,文本分类等等很多场景有非常广泛的应用.比如在邮件分类中,可以这样简单的理解,假如一个邮件用这个词组合(w1,w2,….wn)来表示,那么这个邮件是垃圾邮件的概率是多少.实际

常见机器学习算法原理+实践系列1(逻辑回归)

一,逻辑回归Logistic Regression 逻辑回归是线性模型Y=f(x)=b0+b1*x的延伸,一般用来做2分类问题,输出标记C={0,1},C就是classification的意思,通俗的讲,就要建立Y和C之间的关系,Y是多少的时候,C是0,Y是多少的时候,C是1,传统的线性回归输出的y是实数,在负无穷到正无穷之间,而C是0,1两种,使用Sigmoid函数就可以把y从负无穷到正无穷之间转换到0,1之间,该函数为:y=1/(1+e-z),其中z=wTX,x为自变量,w为权重.P记为发生

mahout 常见机器学习算法及分类

最近一直在学习hadoop 一直没有梳理接触到的东西,常见算法分类: 推荐系统(推荐引擎): 基于用户的协同过滤算法UserCF      近邻算法,容易实现 基于物品的协同过滤算法ItemCF       速度快,容易实现分布式计算 SlopeOne算法       @Deprecated at mahout 0.8 KNN Linear interpolation item–based推荐算法    最近邻算法   @Deprecated at mahout 0.8 SVD推荐算法   奇异