from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat
from scipy.optimize import minimize
# 加载数据
def loadData(path):
data = loadmat(path)
X = data['X']
y = data['y']
return X, y
# 随机打印一张图片
def plot_an_image(X):
pick_one = np.random.randint(0, 5000) # 随机选择一行
image = X[pick_one, :] # 从X中抽取图像数据
fig, ax = plt.subplots(figsize=(1, 1))
ax.matshow(image.reshape((20, 20)), cmap='gray_r') # 灰度图
plt.xticks([]) # 去除刻度,美观
plt.yticks([])
print('this should be {}'.format(y[pick_one]))
plt.show()
# 随机打印100张图
def plot_100_image(X):
sample_idx = np.random.choice(np.arange(X.shape[0]), 100)
sample_img = X[sample_idx, :]
fig, ax_array = plt.subplots(nrows=10, ncols=10, sharey=True,
sharex=True, figsize=(8, 8))
for row in range(10):
for col in range(10):
ax_array[row, col].matshow(sample_img[10 * row + col].reshape((20, 20)),
cmap='gray_r')
plt.xticks([])
plt.yticks([])
plt.show()
def plot_one_type_all_image(X):
sample_img = X[950:1050]
fig, ax_array = plt.subplots(nrows=10, ncols=10, sharey=True,
sharex=True, figsize=(8, 8))
for row in range(10):
for col in range(10):
ax_array[row, col].matshow(sample_img[10 * row + col].reshape((20, 20)),
cmap='gray_r')
plt.xticks([])
plt.yticks([])
plt.show()
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 正则化的代价函数
def regularized_cost(theta, X, y, l):
reg = theta[1:]
first = -y * np.log(sigmoid(X @ theta)) - (1 - y) * np.log(1 - sigmoid(X @ theta))
reg = (reg @ reg) * l / (2 * len(X))
return np.mean(first) + reg
# 正则化的梯度下降
def regularized_gradient(theta, X, y, l):
reg = theta[1:]
first = (1 / len(X)) * X.T @ (sigmoid(X @ theta) - y)
reg = np.concatenate([np.array([0]), (1 / len(X)) * reg]) # concatenate 数组拼接函数, 此处在前面加一个0, 即第一项不惩罚
return first + reg
# 一对多分类训练
def one_vs_all(X, y, l, K):
all_theta = np.zeros((K, X.shape[1]))
for i in range(1, K + 1):
theta = np.zeros(X.shape[1])
y_i = np.array([1 if label == i else 0 for label in y])
ret = minimize(fun=regularized_cost, x0=theta, args=(X, y_i, l), method='TNC', jac=regularized_gradient,
options={'disp': True}) # disp为True, 则打印详细的迭代信息;
all_theta[i - 1, :] = ret.x
return all_theta
def predict_all(X, all_theta):
h = sigmoid(X @ all_theta.T)
h_argmax = np.argmax(h, axis=1)
h_argmax += 1
return h_argmax
def main():
X, y = loadData('./ex3data1.mat')
print(np.unique(y)) # 查看有几类标签
print(X.shape, y.shape)
# plot_an_image(X)
#plot_100_image(X)
X = np.insert(X, 0, 1, axis=1)
# 这里消除了一个维度,方便后面的计算 or .reshape(-1) (5000,)
# 在不降维的情况下是 (5000, 1),也就是5000维向量,转换为展平后的1维,长度是5000的向量
y = y.flatten()
all_theta = one_vs_all(X, y, 1, 10)
'''
使用训练好的参数 all_theta 对训练集特征矩阵 X 进行预测,得到预测的类别标签向量 y_pred。
predict_all 函数根据输入特征矩阵 X 和参数矩阵 all_theta 进行预测,并返回预测的类别标签。
'''
y_pred = predict_all(X, all_theta)
accuracy = np.mean(y_pred == y)
print('accuracy = {0}%'.format(accuracy * 100))
main()
def test():
X, y = loadData('./ex3data1.mat')
print(np.unique(y)) # 查看有几类标签
print(X.shape, y.shape)
plot_one_type_all_image(X)
PhoenixAI8
- 粉丝: 1066
- 资源: 12
最新资源
- uboot代码分析.rar
- pycgal-tools-builder是一个用于将 C++ 实现的 3D 几何工具库封装为 Python 可调用安装包的项目
- 45°C商城系统(thinkphp开源商城源码)
- CNV注释软件,基于Python 3.11(源码)
- 基于大语言模型和 RAG 的知识库问答系统 开箱即用、模型中立、灵活编排,支持快速嵌入到第三方业务系统
- minio策略与权限分配
- 基于OpenCV计算机视觉库实现对答题卡填涂信息的自动、准确识别python源码+运行说明.tar
- .gitignore控制github仓库,哪些要忽略不上传 参考示范
- Spring Cloud商城项目专栏 017 平台属性[属性分组、规格参数、销售属性]
- 运维领域+运维服务方案+IT系统
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈