| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> 人工智能 -> Machine Learning(吴恩达<一>) -> 正文阅读 |
|
|
[人工智能]Machine Learning(吴恩达<一>) |
|
目录 4. 无监督学习(Unsupervised Learning)(如:聚类) 3.7 正规方程(区别于迭代方法求J(?)min的直接解法) 一、机器学习(ML)简介1. 人工智能、机器学习、深度学习的关系机器学习是人工智能的子领域,也是人工智能的核心。它囊括了几乎所有对世界影响最大的方法(包括深度学习)。 机器学习理论主要是设计和分析一些让计算机可以自动学习的算法。 深度学习(DeepLearning,DL)属于机器学习的子类。它的灵感来源于人类大脑的工作方式,是利用深度神经网络来解决特征表达的一种学习过程。 深度神经网络本身并非是一个全新的概念,可理解为包含多个隐含层的神经网络结构。为了提高深层神经网络的训练效果,人们对神经元的连接方法以及激活函数等方面做出了调整。其目的在于建立、模拟人脑进行分析学习的神经网络,模仿人脑的机制来解释数据,如文本、图像、声音。 概括来说:人工智能包括机器学习,机器学习包括深度学习 2. 机器学习与深度学习的比较2.1、应用场景机器学习在指纹识别、特征物体检测等领域的应用基本达到了商业化的要求。 深度学习主要应用于文字识别、人脸技术、语义分析、智能监控等领域。目前在智能硬件、教育、医疗等行业也在快速布局。 2.2、所需数据量机器学习能够适应各种数据量,特别是数据量较小的场景。 如果数据量迅速增加,那么深度学习的效果将更加突出,这是因为深度学习算法需要大量数据才能完美理解。 2.3、执行时间执行时间是指训练算法所需要的时间量。 一般来说,深度学习算法需要大量时间进行训练。这是因为该算法包含有很多参数,因此训练它们需要比平时更长的时间。 相对而言,机器学习算法的执行时间更少。 2.4、解决问题的方法机器学习算法遵循标准程序以解决问题。它将问题拆分成数个部分,对其进行分别解决,而后再将结果结合起来以获得所需的答案。 深度学习则以集中方式解决问题,而不必进行问题拆分。 3. 监督学习(Supervised Learning)指我们给算法一个数据集,其中包含了正确答案,算法的目的就是给出更多的正确答案。也被成为 回归问题(Regression) 回归问题:目的 预测连续的数值输出。 分类问题:目的 预测离散值得输出。 在监督学习中,我们有一个数据集,它被称为一个训练集。 4. 无监督学习(Unsupervised Learning)(如:聚类)吴恩达建议:先用Octave建立起原型,再用其他编程语言(Python)实现速度会大大提高效率!(可以试一试) 无监督学习:指(给定一组无标签的数据集)根据类别未知(没有被标记)的训练样本解决模式识别中的各种问题。 5.一些符号代表一些定义:m:表示训练样本的数量 x:代表输入变量(或输入特征) y:代表输出变量(即需要预测的目标变量) (x,y):表示一个训练样本 (x^(i), y^(i)):表示第i个训练样本 h(hypothesis<假设>):表示假设函数 二、线性回归1. Python设计的一些第三方库的使用1.1 简单的练习
运行结果: array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
2.单变量的线性回归这个部分需要根据城市人口数量,预测开小吃店的利润。 数据在ex1data1.txt里,第一列是城市人口数量,第二列是该城市小吃店利润。 2.1 Plotting the data读入数据,然后展示数据 数据说明 ex1data1.txt需要根据学生的2次测试成绩,预测该学生是否被录取。第一列是第一次测试成绩,第二列是第二次测试成绩
2.2 代价函数(cost function)有时也叫 对于大多数问题,特别是回归问题,都是一个合理的选择。 一个好的代价函数需要满足两个最基本的要求:能够评价模型的准确性,对参数θ可微。 在线性回归中,最常用的是均方误差(Mean squared error),具体形式为:
m:训练样本的个数; hθ(x):用参数θ和x预测出来的y值; y:原训练样本中的y值,也就是标准答案 上角标(i):第i个样本 目标:找到θ0,θ1使J(θ)的值最小。目标函数:minmizeJ(θ) 图像:通常用等高线图表示,J(θ)是一个碗状的图形,并且有全局最小值。全局最小值就是θ0和θ1的最优解。梯度下降的每一步都会更接近这个最小值
2.3?梯度下降这个部分你需要在现有数据集上,训练线性回归的参数θ 公式: 如下图所示梯度下降算法的定义。不断更新θj,直到收敛。
其中? 微妙之处:1.看for可得,需要
2.4 关于矩阵的一些知识矩阵和向量 矩阵(matrix)的维度 = 行数 x 列数 向量(vector):rows x 1 维度的矩阵 通常用大写字母表示 矩阵 ,用 y 表示向量 矩阵的加法 和 与标量的乘法 两个矩阵相加:对应位置元素相加即可 标量矩阵 = 矩阵中每个元素都标量(除法同理) 与矩阵乘法 A1 x A2 = A1行对应的元素 x A2列对应的元素 然后相加求和 得:rowsA1 x colsA2维度的矩阵 矩阵乘法的特性 A x B != B x A A x B x C == A x (B x C) == (A x B) x C 单位矩阵:I(n*n) A x I == I x A 矩阵的逆(inverse)和转置(transpose)
2.5?实现梯度下降算法在线性回归中的应用
|
| Size | Bedrooms | Price | |
|---|---|---|---|
| 0 | 2104 | 3 | 399900 |
| 1 | 1600 | 3 | 329900 |
| 2 | 2400 | 3 | 369000 |
| 3 | 1416 | 2 | 232000 |
| 4 | 3000 | 4 | 539900 |
特征归一化?
观察数据发现,size变量是bedrooms变量的1000倍大小,统一量级会让梯度下降收敛的更快。做法就是,将每类特征减去他的平均值后除以标准差。

梯度下降
# 加一列常数项
data2.insert(0, 'Ones', 1)
# 初始化X和y
cols = data2.shape[1]
X2 = data2.iloc[:,0:cols-1]
y2 = data2.iloc[:,cols-1:cols]
# 转换成matrix格式,初始化theta
X2 = np.matrix(X2.values)
y2 = np.matrix(y2.values)
theta2 = np.matrix(np.array([0,0,0]))
# 运行梯度下降算法
g2, cost2 = gradientDescent(X2, y2, theta2, alpha, iters)
g2
matrix([[-1.10898288e-16, 8.84042349e-01, -5.24551809e-02]])
# 正规方程
def normalEqn(X, y):
theta = np.linalg.inv(X.T@X)@X.T@y# X.T@X等价于X.T.dot(X)
return theta
final_theta2=normalEqn(X, y)#这里用的是data1的数据
final_theta2
matrix([[-3.89578088],
[ 1.19303364]])
梯度下降得到的结果是matrix([[-3.24140214, ?1.1272942 ]])
对于要预测的变量y为离散值时的分类问题,一种新的分类算法:logistic 回归算法。该算法:0<=h(?)<=1
二分类:y∈{0,1},多分类:y∈{1,2,...}(一些离散的值)

决策边界是假设函数的一个属性,决定于假设函数的参数?的取值,不取决于数据集。是两个取值样本的分界线。
即如何拟合逻辑回归模型的参数?。通过数据集,确定?

J(?)为非凹函数,无法得到局部最优解


上面的特征缩放仍然适用于逻辑回归
?在训练的初始阶段,我们将要构建一个逻辑回归模型来预测,某个学生是否被大学录取。设想你是大学相关部分的管理者,想通过申请学生两次测试的评分,来决定他们是否被录取。现在你拥有之前申请学生的可以用于训练逻辑回归的训练样本集。对于每一个训练样本,你有他们两次测试的评分和最后是被录取的结果。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
path = 'E:/Python/machine learning/data/ex2_data1.txt'
data = pd.read_csv(path, header=None, names=['Exam 1', 'Exam 2', 'Admitted'])
data.head()

positive = data[data['Admitted'].isin([1])]
negative = data[data['Admitted'].isin([0])]
fig, ax = plt.subplots(figsize=(12,8))
ax.scatter(positive['Exam 1'], positive['Exam 2'], s=50, c='b', marker='o', label='Admitted')
ax.scatter(negative['Exam 1'], negative['Exam 2'], s=50, c='r', marker='x', label='Not Admitted')
ax.legend()
ax.set_xlabel('Exam 1 Score')
ax.set_ylabel('Exam 2 Score')
plt.show()
?

# 实现sigmoid函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))

# 实现代价函数
def cost(theta, X, y):
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(1 - sigmoid(X * theta.T)))
return np.sum(first - second) / (len(X))
# 加一列常数列
data.insert(0, 'Ones', 1)
# 初始化X,y,θ
cols = data.shape[1]
X = data.iloc[:,0:cols-1]
y = data.iloc[:,cols-1:cols]
theta = np.zeros(3)
# 转换X,y的类型
X = np.array(X.values)
y = np.array(y.values)
# 检查矩阵的维度
X.shape, theta.shape, y.shape
((100, 3), (3,), (100, 1))
# 用初始θ计算代价
cost(theta, X, y)
0.6931471805599453
# 实现梯度计算的函数(并没有更新θ)
def gradient(theta, X, y):
theta = np.matrix(theta)
X = np.matrix(X)
y = np.matrix(y)
parameters = int(theta.ravel().shape[1])
grad = np.zeros(parameters)
error = sigmoid(X * theta.T) - y
for i in range(parameters):
term = np.multiply(error, X[:,i])
grad[i] = np.sum(term) / len(X)
return grad
在此前的线性回归中,我们自己写代码实现的梯度下降(ex1的2.2.4的部分)。当时我们写了一个代价函数、计算了他的梯度,然后对他执行了梯度下降的步骤。这次,我们不自己写代码实现梯度下降,我们会调用一个已有的库。这就是说,我们不用自己定义迭代次数和步长,功能会直接告诉我们最优解。 andrew ng在课程中用的是Octave的“fminunc”函数,由于我们使用Python,我们可以用scipy.optimize.fmin_tnc做同样的事情。 (另外,如果对fminunc有疑问的,可以参考下面这篇百度文库的内容matlab最小值优化问题中fminunc、fmincon的应用 - 百度文库?)
import scipy.optimize as opt
result = opt.fmin_tnc(func=cost, x0=theta, fprime=gradient, args=(X, y))
result
(array([-25.16131863, 0.20623159, 0.20147149]), 36, 0)
# 用θ的计算结果代回代价函数计算
cost(result[0], X, y)
0.20349770158947458
# 画出决策曲线
plotting_x1 = np.linspace(30, 100, 100)
plotting_h1 = ( - result[0][0] - result[0][1] * plotting_x1) / result[0][2]
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(plotting_x1, plotting_h1, 'y', label='Prediction')
ax.scatter(positive['Exam 1'], positive['Exam 2'], s=50, c='b', marker='o', label='Admitted')
ax.scatter(negative['Exam 1'], negative['Exam 2'], s=50, c='r', marker='x', label='Not Admitted')
ax.legend()
ax.set_xlabel('Exam 1 Score')
ax.set_ylabel('Exam 2 Score')
plt.show()

在确定参数之后,我们可以使用这个模型来预测学生是否录取。如果一个学生exam1得分45,exam2得分85
# 实现hθ
def hfunc1(theta, X):
return sigmoid(np.dot(theta.T, X))
hfunc1(result[0],[1,45,85])
0.7762906240463825
另一种评价θ的方法是看模型在训练集上的正确率怎样。写一个predict的函数,给出数据以及参数后,会返回“1”或者“0”。然后再把这个predict函数用于训练集上,看准确率怎样。
# 定义预测函数
def predict(theta, X):
probability = sigmoid(X * theta.T)
return [1 if x >= 0.5 else 0 for x in probability]
# 统计预测正确率
theta_min = np.matrix(result[0])
predictions = predict(theta_min, X)
correct = [1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0 for (a, b) in zip(predictions, y)]
accuracy = (sum(map(int, correct)) % len(correct))
print ('accuracy = {0}%'.format(accuracy))
accuracy = 89%
在训练的第二部分,我们将实现加入正则项提升逻辑回归算法。 设想你是工厂的生产主管,你有一些芯片在两次测试中的测试结果,测试结果决定是否芯片要被接受或抛弃。你有一些历史数据,帮助你构建一个逻辑回归模型。
path = 'E:/Python/machine learning/data/ex2_data2.txt'
data_init = pd.read_csv(path, header=None, names=['Test 1', 'Test 2', 'Accepted'])
data_init.head()

positive2 = data_init[data_init['Accepted'].isin([1])]
negative2 = data_init[data_init['Accepted'].isin([0])]
fig, ax = plt.subplots(figsize=(12,8))
ax.scatter(positive2['Test 1'], positive2['Test 2'], s=50, c='b', marker='o', label='Accepted')
ax.scatter(negative2['Test 1'], negative2['Test 2'], s=50, c='r', marker='x', label='Rejected')
ax.legend()
ax.set_xlabel('Test 1 Score')
ax.set_ylabel('Test 2 Score')
plt.show()

以上图片显示,这个数据集不能像之前一样使用直线将两部分分割。而逻辑回归只适用于线性的分割,所以,这个数据集不适合直接使用逻辑回归。
一种更好的使用数据集的方式是为每组数据创造更多的特征。所以我们为每组添加了最高到6次幂的特征
degree = 6
data2 = data_init
x1 = data2['Test 1']
x2 = data2['Test 2']
data2.insert(3, 'Ones', 1)
for i in range(1, degree+1):
for j in range(0, i+1):
data2['F' + str(i-j) + str(j)] = np.power(x1, i-j) * np.power(x2, j)
#此处原答案错误较多,已经更正
data2.drop('Test 1', axis=1, inplace=True)
data2.drop('Test 2', axis=1, inplace=True)
data2.head()

?在原来的基础上加上正则项(缩小每一个?) 记住?0是不需要正则化的,下标从1开始。 梯度的第j个元素的更新公式为:对上面的算法中 j=1,2,...,n 时的更新式子进行调整可得:把初始(所有元素为0)带入,代价应为0.693这一部分要实现计算逻辑回归的代价函数和梯度的函数。代价函数公式如下:

# 实现正则化的代价函数
def costReg(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(1 - sigmoid(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 = np.matrix(y)
parameters = int(theta.ravel().shape[1])
grad = np.zeros(parameters)
error = sigmoid(X * theta.T) - y
for i in range(parameters):
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
# 初始化X,y,θ
cols = data2.shape[1]
X2 = data2.iloc[:,1:cols]
y2 = data2.iloc[:,0:1]
theta2 = np.zeros(cols-1)
# 进行类型转换
X2 = np.array(X2.values)
y2 = np.array(y2.values)
# λ设为1
learningRate = 1
# 计算初始代价
costReg(theta2, X2, y2, learningRate)
0.6931471805599454
result2 = opt.fmin_tnc(func=costReg, x0=theta2, fprime=gradientReg, args=(X2, y2, learningRate))
result2
(array([ 1.27271027, 0.62529965, 1.18111686, -2.01987399, -0.9174319 ,
-1.43166929, 0.12393227, -0.36553118, -0.35725403, -0.17516292,
-1.45817009, -0.05098418, -0.61558552, -0.27469165, -1.19271298,
-0.24217841, -0.20603297, -0.04466178, -0.27778952, -0.29539513,
-0.45645981, -1.04319155, 0.02779373, -0.29244872, 0.01555761,
-0.32742406, -0.1438915 , -0.92467487]),32,1)
最后,我们可以使用第1部分中的预测函数来查看我们的方案在训练数据上的准确度。
theta_min = np.matrix(result2[0])
predictions = predict(theta_min, X2)
correct = [1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0 for (a, b) in zip(predictions, y2)]
accuracy = (sum(map(int, correct)) % len(correct))
print ('accuracy = {0}%'.format(accuracy))
accuracy = 98%
def hfunc2(theta, x1, x2):
temp = theta[0][0]
place = 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][place+1]
place+=1
return temp
def find_decision_boundary(theta):
t1 = np.linspace(-1, 1.5, 1000)
t2 = np.linspace(-1, 1.5, 1000)
cordinates = [(x, y) for x in t1 for y in t2]
x_cord, y_cord = zip(*cordinates)
h_val = pd.DataFrame({'x1':x_cord, 'x2':y_cord})
h_val['hval'] = hfunc2(theta, h_val['x1'], h_val['x2'])
decision = h_val[np.abs(h_val['hval']) < 2 * 10**-3]
return decision.x1, decision.x2
fig, ax = plt.subplots(figsize=(12,8))
ax.scatter(positive2['Test 1'], positive2['Test 2'], s=50, c='b', marker='o', label='Accepted')
ax.scatter(negative2['Test 1'], negative2['Test 2'], s=50, c='r', marker='x', label='Rejected')
ax.set_xlabel('Test 1 Score')
ax.set_ylabel('Test 2 Score')
x, y = find_decision_boundary(result2)
plt.scatter(x, y, c='y', s=10, label='Prediction')
ax.legend()
plt.show()

λ=0时 过拟合
learningRate2 = 0
result3 = opt.fmin_tnc(func=costReg, x0=theta2, fprime=gradientReg, args=(X2, y2, learningRate2))
result3
(array([ 9.11192364e+00, 1.18840465e+01, 6.30828094e+00, -8.39706468e+01,
-4.48639810e+01, -3.81221435e+01, -9.42525756e+01, -8.14257602e+01,
-4.22413355e+01, -3.52968361e+00, 2.95734207e+02, 2.51308760e+02,
3.64155830e+02, 1.61036970e+02, 5.70100234e+01, 1.71716716e+02,
2.72109672e+02, 3.12447535e+02, 1.41764016e+02, 3.22495698e+01,
-1.75836912e-01, -3.58663811e+02, -4.82161916e+02, -7.49974915e+02,
-5.03764307e+02, -4.80978435e+02, -1.85566236e+02, -3.83936243e+01]),
280,
3)
fig, ax = plt.subplots(figsize=(12,8))
ax.scatter(positive2['Test 1'], positive2['Test 2'], s=50, c='b', marker='o', label='Accepted')
ax.scatter(negative2['Test 1'], negative2['Test 2'], s=50, c='r', marker='x', label='Rejected')
ax.set_xlabel('Test 1 Score')
ax.set_ylabel('Test 2 Score')
x, y = find_decision_boundary(result3)
plt.scatter(x, y, c='y', s=10, label='Prediction')
ax.legend()
plt.show()

?λ=100时欠拟合
learningRate3 = 100
result4 = opt.fmin_tnc(func=costReg, x0=theta2, fprime=gradientReg, args=(X2, y2, learningRate3))
fig, ax = plt.subplots(figsize=(12,8))
ax.scatter(positive2['Test 1'], positive2['Test 2'], s=50, c='b', marker='o', label='Accepted')
ax.scatter(negative2['Test 1'], negative2['Test 2'], s=50, c='r', marker='x', label='Rejected')
ax.set_xlabel('Test 1 Score')
ax.set_ylabel('Test 2 Score')
x, y = find_decision_boundary(result4)
plt.scatter(x, y, c='y', s=10, label='Prediction')
ax.legend()
plt.show()

暑假大概就看这么多,先保存下来趴。
|
|
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年11日历 | -2025/11/28 6:51:56- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |