高斯核函数python代码_MachineLearning_Python

本文详细介绍了机器学习中的高斯核函数,包括其在Python中的实现,以及如何应用于支持向量机(SVM)和K-Means聚类算法。还探讨了PCA主成分分析的原理和在数据降维中的应用。文章通过实例代码展示了如何计算代价函数、梯度下降、归一化、逻辑回归和多项式特征映射,以及如何使用Scikit-Learn库进行SVM和K-Means模型的训练与预测。此外,讨论了异常检测中的高斯分布和多元高斯分布,以及如何选择特征和异常阈值。
摘要由CSDN通过智能技术生成

机器学习算法Python实现

目录

1、代价函数

其中:

下面就是要求出theta,使代价最小,即代表我们拟合出来的方程距离真实值最近

共有m条数据,其中

代表我们要拟合出来的方程到真实值距离的平方,平方的原因是因为可能有负值,正负可能会抵消

前面有系数2的原因是下面求梯度是对每个变量求偏导,2可以消去

实现代码:

# 计算代价函数

def computerCost(X,y,theta):

m = len(y)

J = 0

J = (np.transpose(X*theta-y))*(X*theta-y)/(2*m) #计算代价J

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代入泰勒展开式中:f(x+△x)=f(x)-α*[f'(x)]²+o(△x)

可以看出,α是取得很小的正数,[f'(x)]²也是正数,所以可以得出:f(x+△x)<=f(x)

所以沿着负梯度放下,函数在减小,多维情况一样。

实现代码

# 梯度下降算法

def gradientDescent(X,y,theta,alpha,num_iters):

m = len(y)

n = len(theta)

temp = np.matrix(np.zeros((n,num_iters))) # 暂存每次迭代计算的theta,转化为矩阵形式

J_history = np.zeros((num_iters,1)) #记录每次迭代计算的代价值

for i in range(num_iters): # 遍历迭代次数

h = np.dot(X,theta) # 计算内积,matrix可以直接乘

temp[:,i] = theta - ((alpha/m)*(np.dot(np.transpose(X),h-y))) #梯度的计算

theta = temp[:,i]

J_history[i] = computerCost(X,y,theta) #调用计算代价函数

print '.',

return theta,J_history

3、均值归一化

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

其中

为所有此feture数据的平均值

可以是最大值-最小值,也可以是这个feature对应的数据的标准差

实现代码:

# 归一化feature

def featureNormaliza(X):

X_norm = np.array(X) #将X转化为numpy数组对象,才可以进行矩阵的运算

#定义所需变量

mu = np.zeros((1,X.shape[1]))

sigma = np.zeros((1,X.shape[1]))

mu = np.mean(X_norm,0) # 求每一列的平均值(0指定为列,1代表行)

sigma = np.std(X_norm,0) # 求每一列的标准差

for i in range(X.shape[1]): # 遍历列

X_norm[:,i] = (X_norm[:,i]-mu[i])/sigma[i] # 归一化

return X_norm,mu,sigma

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

4、最终运行结果

代价随迭代次数的变化

导入包

from sklearn import linear_model

from sklearn.preprocessing import StandardScaler #引入缩放的包

归一化

# 归一化操作

scaler = StandardScaler()

scaler.fit(X)

x_train = scaler.transform(X)

x_test = scaler.transform(np.array([1650,3]))

线性模型拟合

# 线性模型拟合

model = linear_model.LinearRegression()

model.fit(x_train, y)

预测

#预测结果

result = model.predict(x_test)

1、代价函数

可以综合起来为:

其中:

为什么不用线性回归的代价函数表示,因为线性回归的代价函数可能是非凸的,对于分类问题,使用梯度下降很难得到最小值,上面的代价函数是凸函数

的图像如下,即y=1时:

可以看出,当

趋于1,y=1,与预测值一致,此时付出的代价cost趋于0,若

趋于0,y=1,此时的代价cost值非常大,我们最终的目的是最小化代价值

同理

的图像如下(y=0):

2、梯度

同样对代价函数求偏导:

可以看出与线性回归的偏导数一致

推到过程

3、正则化

目的是为了防止过拟合

在代价函数中加上一项

注意j是重1开始的,因为theta(0)为一个常数项,X中最前面一列会加上1列1,所以乘积还是theta(0),feature没有关系,没有必要正则化

正则化后的代价:

# 代价函数

def costFunction(initial_theta,X,y,inital_lambda):

m = len(y)

J = 0

h = sigmoid(np.dot(X,initial_theta)) # 计算h(z)

theta1 = initial_theta.copy() # 因为正则化j=1从1开始,不包含0,所以复制一份,前theta(0)值为0

theta1[0] = 0

temp = np.dot(np.transpose(theta1),theta1)

J = (-np.dot(np.transpose(y),np.log(h))-np.dot(np.transpose(1-y),np.log(1-h))+temp*inital_lambda/2)/m # 正则化的代价方程

return J

正则化后的代价的梯度

# 计算梯度

def gradient(initial_theta,X,y,inital_lambda):

m = len(y)

grad = np.zeros((initial_theta.shape[0]))

h = sigmoid(np.dot(X,initial_theta))# 计算h(z)

theta1 = initial_theta.copy()

theta1[0] = 0

grad = np.dot(np.transpose(X),h-y)/m+inital_lambda/m*theta1 #正则化的梯度

return grad

4、S型函数(即

)

实现代码:

# S型函数

def sigmoid(z):

h = np.zeros((len(z),1)) # 初始化,与z的长度一置

h = 1.0/(1.0+np.exp(-z))

return h

5、映射为多项式

因为数据的feture可能很少,导致偏差大,所以创造出一些feture结合

eg:映射为2次方的形式:

实现代码:

# 映射为多项式

def mapFeature(X1,X2):

degree = 3; # 映射的最高次方

out = np.ones((X1.shape[0],1)) # 映射后的结果数组(取代X)

'''

这里以degree=2为例,映射为1,x1,x2,x1^2,x1,x2,x2^2

'''

for i in np.arange(1,degree+1):

for j in range(i+1):

temp = X1**(i-j)*(X2**j) #矩阵直接乘相当于matlab中的点乘.*

out = np.hstack((out, temp.reshape(-1,1)))

return out

6、使用scipy的优化方法

梯度下降使用scipy中optimize中的fmin_bfgs函数

调用scipy中的优化算法fmin_bfgs(拟牛顿法Broyden-Fletcher-Goldfarb-Shanno

costFunction是自己实现的一个求代价的函数,

initial_theta表示初始化的值,

fprime指定costFunction的梯度

args是其余测参数,以元组的形式传入,最后会将最小化costFunction的theta返回

result = optimize.fmin_bfgs(costFunction, initial_theta, fprime=gradient, args=(X,y,initial_lambda))

7、运行结果

data1决策边界和准确度

data2决策边界和准确度

导入包

from sklearn.linear_model import LogisticRegression

from sklearn.preprocessing import StandardScaler

from sklearn.cross_validation import train_test_split

import numpy as np

划分训练集和测试集

# 划分为训练集和测试集

x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.2)

归一化

# 归一化

scaler = StandardScaler()

x_train = scaler.fit_transform(x_train)

x_test = scaler.fit_transform(x_test)

逻辑回归

#逻辑回归

model = LogisticRegression()

model.fit(x_train,y_train)

预测

# 预测

predict = model.predict(x_test)

right = sum(predict == y_test)

predict = np.hstack((predict.reshape(-1,1),y_test.reshape(-1,1))) # 将预测值和真实值放在一块,好观察

print predict

print ('测试集准确率:%f%%'%(right*100.0/predict.shape[0])) #计算在测试集上的准确度

1、随机显示100个数字

我没有使用scikit-learn中的数据集,像素是20*20px,彩色图如下

灰度图:

实现代码:

# 显示100个数字

def display_data(imgData):

sum = 0

'''

显示100个数(若是一个一个绘制将会非常慢,可以将要画的数字整理好,放到一个矩阵中,显示这个矩阵即可)

- 初始化一个二维数组

- 将每行的数据调整成图像的矩阵,放进二维数组

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值