吴恩达机器学习--正则化实例分析

一.问题描述:设想你是工厂的生产主管,你有一些芯片在两次测试中的结果,测试结果决定是否芯片要被接收
二.代码演示:

模块导入

#模块导入
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

数据读取:

#数据读入
path = r'C:\Users\18810\Desktop\机器学习方法\吴恩达学习笔记\逻辑回归\ex2data2.txt'
data_ex3 = pd.read_csv(path, header = None, names = ['Test 1', 'Test 2', 'Accepted'])
data_ex3.head()#查看前五行数据

绘制初始散点图关系

#绘制图像
positive = data_ex3[data_ex3['Accepted'].isin([1])]
negative = data_ex3[data_ex3['Accepted'].isin([0])]
#绘制散点图
fig, ax = plt.subplots(figsize = (12, 8))
ax.scatter(positive['Test 1'], positive['Test 2'], s = 50, c = 'b', label = 'Accepted')
ax.scatter(negative['Test 1'], negative['Test 2'], s = 50, c = 'r', label = 'Not Accepted')
ax.legend()
ax.set_xlabel('Test 1 Score')
ax.set_ylabel('Test 2 Score')
plt.show()

创建一组多项式入手来进行决策界限的选取–特征映射:
在这里插入图片描述

degree = 5
data3 = data_ex3.copy()
x1 = data3['Test 1']
x2 = data3['Test 2']
#插入一个全1列
data3.insert(3, 'Ones', 1)
for i in range(1, degree + 1):
	for j in range(0, i + 1):
		data3['F' + str(i - j)+ str(j)] = np.power(x1, i - j) * np.power(x2, j)
data3.drop('Test 1', axis = 1, inplace = True)
data3.drop('Test 2', axis = 1, inplace = True)
#此时结果为:
118*29维度的数据
列名为:
['Accepted', 'Ones', 'F10', 'F01', 'F20', 'F11', 'F02', 'F30', 'F21', 'F12', 'F03', 'F40', 'F31', 'F22', 'F13', 'F04', 'F50', 'F41', 'F32', 'F23', 'F14', 'F05', 'F60', 'F51', 'F42', 'F33', 'F24', 'F15', 'F06']

正则化下的代价函数:
在这里插入图片描述

#代价函数和梯度
#sigmoid函数
def sigmoid(z):
    return 1 / (1 + np.exp(- z))
#代价函数:
def costFunction(theta, X, y, learningRate):
	theta = np.matrix(theta)
	X = np.matrix(X)
	y = np.matrix(y)
	first = np.multiply(-y, np.log(sigmoid(X * theta.T)))
	second = np.multiply(1 - y, np.log(sigmoid(1 - X * theta.T)))
	reg = (learningRate / (2 * len(X))) * np.sum(np.power(theta[:,1:theta.shape[1]], 2))
	return np.sum(first - second) / len(X) + reg

正则化下的梯度更新:
在这里插入图片描述

def gradientReg(theta, X, y, learningRate):
	theta = np.matrix(theta)
	X = np.matrix(X)
	y = n.matrix(y)
	par = theta.shape[1]
	
	grad = np.zeros(par)
	error = sigmoid(X * theta.T)
	for i in range(par):
		term = np.multiply(error, X[:, i])
		if i == 0:
			grad[i] = np.sum(term) / len(X)
		else:
			grad[i] = np.sum(term) / len(X) + (learningRate / len(X)) * theta[:, i]
	return grad

参数初始化

#初始化参数
cols = data3.shape[1]
X = data3.iloc[:,1:cols]
y = data3.iloc[:,0:1]
X = np.array(X.values)
y = np.array(y.values)
theta = np.zeros(cols - 1)
#设置初始学习率
learningRate = 1

优化算法求解最佳theta参数值:
优化函数为:

import scipy.optimize as opt
opt.fmin_tnc函数

其中:
func:代表所要优化的目标函数
x0为初值
fprime:提供优化的梯度函数,不然优化函数func必须返回函数值和梯度,或者设置approx_grad = True
args:元组,除了x0以外额外传递给优化函数的参数

#利用优化算法进行求解
result = opt.fmin_tnc(func = costFunction, x0 = theta, fprime = gradientReg, args = (X, y, learningRate))

对预测函数进行评估:

theta_min = np.matrix(result[0])
def predict(X, theta):
	X = np.matrix(X)
	theta = np.matrix(theta)
	probability = sigmoid(X * theta.T)
	return [1 if x >= 0.5 else 0 for x in probability]
for i in range(len(X)):
	if predict[i] == y.ravel()[i]:
		predict[i] = 1
	else:
		predict[i] = 0
print('accuracy = {0}%'.format(np.sum(predict)))

决策曲线绘制

def hfun2(theta,x1, x2):
	init = 0
	temp = theta[0][0]
	for i in range(1,degree + 1):
		for j in range(0, i + 1):
			temp += np.power(x1, i - j) * np.power(x2, j) * theta[0][init+1]
			init += 1
	return temp
			 
def decision_boundary(theta):
	t1_x = np.linspace(-0.75, 1, 1000)
	t2_y = np.linspace(-0.75, 1, 1000)

	cordinates = [(x, y) for x in range(t1_x) for y in range(t2_y)]
	x_cord, y_cord = zip(*cordinates)#解压缩
	h_val = pd.DataFrame({'x1':x_cord, 'x2':y_cord})
	h_val['hval'] = hfun2(theta, x_cord, y_cord)
	decision = h_val[np.abs(h_val['hval']) < 2 * 10 ** (-3)]
	return decision['x1'], decision['x2']

ax, fig = plt.subplots(figsiz = (12, 8))
ax.scatter(positive_test['Test 1'], positive_test['Test 2'], s = 50, c = 'b', label = 'Accepted')
ax.scatter(negative_test['Test 1'], negative_test['Test 2'], s = 50, c = 'r', label = 'Not Accepted')
ax.set_xlabel('Exam 1 Score')
ax.set_ylabel('Exam 2 Score')
x, y = decision_boundary(result)
plt.scatter(x, y, s = 10, c = 'y', label = 'Predict')#属性s决定点的直径大小
ax.legend()
plt.show()

对决策曲线的理解:
在这里插入图片描述
附:以正规方程法实现参数的最优化:
理论公式:
在这里插入图片描述
在这里插入图片描述编程实现:

#模块引入
import pandas as pd
import numpy as np
#对于新添加的类似方阵的矩阵,实现为
X = np.matrix(X)
y = np.matrix(y)
identity_nomal = np.identity(X.shape[1])
identity_normal[0][0] = 0
result = np.linalg.pinv(X.T@X + identity_normal)@X.T@y#np.linalg.pinv求解矩阵伪逆

10-3复习:
正则化中特征映射
正则化中采用高效算法的参数设置
正则化中不能用线性化曲线作为决策边界时的处理方法
一些函数的用法说明(zip等)
复习总结:
1.首先在于二分类中数据的选择:

positive = data[data['Accepted'].isin([1])]#表示data数据中列名为'Accepted'的列中筛选对应数据为1的行
negative = data[data['Accepted'].isin([0])]#表示data数据中列名为'Accepted'的列中筛选对应数据为0的行

2.绘制图表中的一些细节:

ax.scatter(x, y, s = 50, c = 'r')#其中的s属性代散点的直径大小,c代表颜色

3.特征映射
–>具体分析见上文
4.pandas中的drop函数用法:

data.drop(标签名,axis, inplace)#axis参数不设置默认删除对应的行,inplace参数不设置的话默认原数据不发生改变,需要赋值给另外一个数据才可以发挥drop函数的作用.
#inplace参数决定经过drop函数处理后的data是否改变
#凡是会对原数组作出修改并返回一个新数组的,往往都有一个 inplace可选参数。如果手动设定为True(默认为False),
# 那么原数组直接就被替换。也就是说,采用inplace=True之后,原数组名(如2和3情况所示)对应的内存值直接改变;
#而采用inplace=False之后,原数组名对应的内存值并不改变,需要将新的结果赋给一个新的数组或者覆盖原数组的内存位置

5.高效算法
–>具体分析见上文
6.绘制决策曲线:

t1 = np.linspace(-0.75, 1, 1000)
t2 = np.linspace(-0.75, 1, 1000)
cordinates = [(x, y) for x in t1 for y in t2]
#从原图形所在区域找出10 ** 6 个点进行决策边界的选取采样
np.abs(h_val['hval']) < 2 * 10 ** -3#作为决策临界值(2 * 10 ** (-3))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值