数据可视化期末考试(编程)

1.KNN

1.新增数据的分类

import pandas as pd  
  
# 您的原始数据字典  
data = {    
    '电影名称': ['电影1', '电影2', '电影3', '电影4', '电影5'],    
    '打斗镜头': [10, 5, 108, 115, 20],    
    '接吻镜头': [110, 89, 5, 8, 200],    
    '电影类型': ['爱情片', '爱情片', '动作片', '动作片', '爱情片']    
}  
  
# 将数据字典转换为DataFrame  
df = pd.DataFrame(data)  
  
# 定义一个简单的分类逻辑(这里只是一个示例,您可以根据数据调整阈值)  
def predict_movie_type(fights, kisses):  
    if fights > kisses:  
        return '动作片'  
    else:  
        return '爱情片'  
  
# 输入您想要预测的电影数据  
input_fights = float(input("请输入打斗镜头的数量: "))  
input_kisses = float(input("请输入接吻镜头的数量: "))  
  
# 预测电影类型  
predicted_type = predict_movie_type(input_fights, input_kisses)  
print(f"基于您输入的数据,电影类型被预测为: {predicted_type}")

2.把新增数据放在散点图上并标记坐标

import numpy as np  
import pandas as pd  
import matplotlib.pyplot as plt  
  
# 您的修正后的数据字典  
data = {    
    '电影名称': ['电影1', '电影2', '电影3', '电影4', '电影5'],    
    '打斗镜头': [10, 5, 108, 115, 120],    
    '接吻镜头': [110, 89, 5, 8, 20],    
    '电影类型': ['爱情片', '爱情片', '动作片', '动作片', '动作片']    
}  
  
pd_data = pd.DataFrame(data)  
  
colors = ['red' if t == '爱情片' else 'green' for t in pd_data['电影类型']]  
  
# 设置中文字体,以便正确显示中文标签和标题  
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体显示中文  
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号  
  
# 创建图形和散点图  
plt.figure()  
  
# 绘制散点图并添加坐标  
for index, row in pd_data.iterrows():  
    plt.scatter(row['打斗镜头'], row['接吻镜头'], c=colors[index])  
    plt.annotate(f'({row["打斗镜头"]}, {row["接吻镜头"]})',   
                 (row['打斗镜头'], row['接吻镜头']),   
                 textcoords="offset points", xytext=(0,10), ha='center')  
  
plt.grid(linestyle='-.')  
plt.xlim(0, 140)  
plt.ylim(0, 220)  # 调整y轴范围以适应新的数据  
  
plt.xlabel("打斗镜头")  
plt.ylabel("接吻镜头")  
plt.title("电影分析")  
  
# 添加图例  
legend_elements = [plt.Line2D([0], [0], color='red', label='爱情片'),  
                    plt.Line2D([0], [0], color='green', label='动作片')]  
plt.legend(handles=legend_elements, loc='best')  
  
# 显示图形  
plt.show()

2.logistic回归,用线性来划分两个类型

import matplotlib.pyplot as plt
import numpy as np


#用回归思想作二分类(线性回归 wx+b),用激活函数(sigmoid函数)来转为0 1的结果进行分类【z=wx+b】。
#x:为样本的输入特征向量,w和b:w为模型权重参数参数,b为偏置。当确定w和b时,可确定模型
#所以,需要损失函数来确定最优的w和b(随机事件越不确定,所包含的信息量就越多,熵越大)
#则,样本所属类别的概率,而这个概率越大越好,所以也就是求解这个损失函数的最大值。
#怎么求解使J(θ)最大的θ值呢?因为是求最大值,所以我们需要使用梯度上升算法。
#(个人理解θ就是w0,w1,w2)

"""
def loadDataSet():
	dataMat = []														#创建数据列表
	labelMat = []														#创建标签列表
	fr = open('testSet.txt')											#打开文件	
	for line in fr.readlines():											#逐行读取
		lineArr = line.strip().split()									#去回车,放入列表,以空格分割split,并去掉空格strip
		dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])		#添加数据,
#lineArr[0]放w,lineArr[1]放x
#z=w0x0 + w1x1 + w2x2,即可将数据分割开。其中,x0为全是1的向量,x1为数据集的第一列数据,x2为数据集的第二列数据。
#另z=0,则0=w0 + w1x1 + w2x2。横坐标为x1,纵坐标为x2。这个方程未知的参数为w0,w1,w2,也就是我们需要求的回归系数(最优参数)。
		labelMat.append(int(lineArr[2]))								#添加标签,第三列标签
#labelMat即为分类标签。根据标签的不同,对这些点进行分类。
	fr.close()															#关闭文件
	return dataMat, labelMat											#返回
if __name__=='__main__':
	dataMat,labelMat=loadDataSet()
	print(dataMat)
	print(labelMat)    

def plotDataSet():
	dataMat, labelMat = loadDataSet()									#加载数据集
	dataArr = np.array(dataMat)											#转换成numpy的array数组
	n = np.shape(dataMat)[0]											#数据个数(读取一维dataMat矩阵的长度)
	xcord1 = []; ycord1 = []											#正样本
	xcord2 = []; ycord2 = []											#负样本
	for i in range(n):													#根据数据集标签进行分类
		if int(labelMat[i]) == 1:
			xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])	#1为正样本
#dataArr[i,1]:表示dataArr[]数组中下标为1的第i个元素
		else:
			xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])	#0为负样本
	fig = plt.figure()#创建一个绘图对象
	ax = fig.add_subplot(111)											#添加subplot
#add_subplot(111),a=1,b=1,c=1,表示把他的行和列都分为1份,
#其实就是保持不变,所以子图只有1*1=1个,那么当我们最后选择展示第1个子图时,其实就是展示他本身。
	ax.scatter(xcord1, ycord1, s = 30, c = "red", marker = 'x',alpha=0.9)#绘制正样本(用于生成一个scatter散点图)
#s:表示的是大小,是一个标量或者是一个shape大小为(n,)的数组,可选,默认20。
#marker:MarkerStyle,表示的是标记的样式,可选,默认’o’
#alpha:标量(表样本点的亮度),0-1之间,可选,默认None。
	ax.scatter(xcord2, ycord2, s =30, c = 'blue',alpha=0.9)			#绘制负样本
	plt.title('DataSet')												#绘制title
	plt.xlabel('X1'); plt.ylabel('X2')									#绘制label
	plt.show()															#显示
plotDataSet()

def sigmoid(inX):
	sig= 1.0 / (1 + np.exp(-inX))
	return sig
def Gradient_Ascent_test():
	def f_prime(x_old):									#f(x)的导数
		return -2 * x_old + 4
	x_old = -1											#初始值,给一个小于x_new的值
	x_new = 0											#梯度上升算法初始值,即从(0,0)开始
	alpha = 0.001										#步长,也就是学习速率,控制更新的幅度
	presision = 0.00000001								#精度,也就是更新阈值
	while abs(x_new - x_old) > presision:
		x_old = x_new
		x_new = x_old + alpha * f_prime(x_old)			#上面提到的公式
	print(x_new)										#打印最终求解的极值近似值
Gradient_Ascent_test()

def gradAscent(dataMatIn, classLabels):
	dataMatrix = np.mat(dataMatIn)										#转换成numpy的mat(生成矩阵)
	labelMat = np.mat(classLabels).transpose()							#转换成numpy的mat,并进行转置(行变列)
#区别mat和array,mat可以从字符串或者列表中生成,但是array只能从列表中生成
	m, n = np.shape(dataMatrix)#返回dataMatrix的大小。m为行数,n为列数。
	alpha = 0.001														#移动步长,也就是学习速率,控制更新的幅度。
	maxCycles = 500														#最大迭代次数
	weights = np.ones((n,1))
    #返回n个数组,每个数组1个元素(上述定义n为列数)
	weights_history = []     
	for k in range(maxCycles):
		h= sigmoid(dataMatrix * weights)
		error = labelMat - h#是公式里的【y-h0(x)】(labelMat是有0或1的矩阵)
        
		weights = weights + alpha * dataMatrix.transpose() * error    #  梯度上升迭代公式

	return weights.getA()												#将矩阵转换为数组,返回权重数组
if __name__=='__main__':
	weights= gradAscent(dataMat,labelMat)
#	weights, weights_history = gradAscent(dataMat, labelMat)
	print(weights)

def plotBestFit(dataMat, labelMat, weights):
	dataMat, labelMat = loadDataSet()									#加载数据集,
#将loadDataSet()函数得到的dataMat, labelMat值传到dataMat, labelMat
	dataArr = np.array(dataMat)											#转换成numpy的array数组
	n = np.shape(dataMat)[0]											#数据个数,
	xcord1 = []; ycord1 = []											#正样本
	xcord2 = []; ycord2 = []											#负样本
	for i in range(n):													#根据数据集标签进行分类
		if int(labelMat[i]) == 1:
			xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])	#1为正样本
		else:
			xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])	#0为负样本
	fig = plt.figure()
	ax = fig.add_subplot(111)											#添加subplot
	ax.scatter(xcord1, ycord1, s = 30, c = 'red', marker = 'x',alpha=.9)#绘制正样本
#s:表示的是大小,是一个标量或者是一个shape大小为(n,)的数组,可选,默认20。
#marker:MarkerStyle,表示的是标记的样式,可选,默认’o’
#alpha:标量(表样本点的亮度),0-1之间,可选,默认None。
	ax.scatter(xcord2, ycord2, s = 30, c = 'blue',alpha=.9)			#绘制负样本
	x = np.arange(-3.0, 3.0, 0.1)
	y = (-weights[0] - weights[1] * x) / weights[2]
	ax.plot(x, y)
	plt.title('BestFit')												#绘制title
	plt.xlabel('X1'); plt.ylabel('X2')									#绘制label
	plt.show()		
plotBestFit(dataMat, labelMat, weights)

3.logistic,回归系数与迭代次数的关系

# -*- coding:UTF-8 -*-
from matplotlib.font_manager import FontProperties
import matplotlib.pyplot as plt
import numpy as np
import random
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def loadDataSet():  
    dataMat = []  
    labelMat = []  
    fr = open('testSet.txt')  # 替换为你的数据文件路径  
    for line in fr.readlines():  
        lineArr = line.strip().split()  
        if len(lineArr) >= 3:  # 检查列表长度是否足够  
            dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])  
            labelMat.append(int(lineArr[2]))  
        else:  
            print(f"Skipping line with insufficient data: {line.strip()}")  
    fr.close()  
    return dataMat, labelMat

"""
函数说明:梯度上升算法

Parameters:
	dataMatIn - 数据集
	classLabels - 数据标签
Returns:
	weights.getA() - 求得的权重数组(最优参数)
	weights_array - 每次更新的回归系数
"""
def gradAscent(dataMatIn, classLabels):
	dataMatrix = np.mat(dataMatIn)										#转换成numpy的mat
	labelMat = np.mat(classLabels).transpose()							#转换成numpy的mat,并进行转置
	m, n = np.shape(dataMatrix)											#返回dataMatrix的大小。m为行数,n为列数。
	alpha = 0.01														#移动步长,也就是学习速率,控制更新的幅度。
	maxCycles = 500														#最大迭代次数
	weights = np.ones((n,1))
	weights_array = np.array([])
	for k in range(maxCycles):
		h = sigmoid(dataMatrix * weights)								#梯度上升矢量化公式
		error = labelMat - h
		weights = weights + alpha * dataMatrix.transpose() * error
		weights_array = np.append(weights_array,weights)
	weights_array = weights_array.reshape(maxCycles,n)
	return weights.getA(),weights_array									#将矩阵转换为数组,并返回

"""
函数说明:改进的随机梯度上升算法
Parameters:
	dataMatrix - 数据数组
	classLabels - 数据标签
	numIter - 迭代次数
Returns:
	weights - 求得的回归系数数组(最优参数)
	weights_array - 每次更新的回归系数
"""
def stocGradAscent1(dataMatrix, classLabels, numIter=150):
	m,n = np.shape(dataMatrix)												#返回dataMatrix的大小。m为行数,n为列数。
	weights = np.ones(n)   													#参数初始化
	weights_array = np.array([])											#存储每次更新的回归系数
	for j in range(numIter):											
		dataIndex = list(range(m))
		for i in range(m):			
			alpha = 4/(1.0+j+i)+0.01   	 									#降低alpha的大小,每次减小1/(j+i)。
			randIndex = int(random.uniform(0,len(dataIndex)))				#随机选取样本
			h = sigmoid(sum(dataMatrix[dataIndex[randIndex]]*weights))		#选择随机选取的一个样本,计算h
			error = classLabels[dataIndex[randIndex]] - h 								#计算误差
			weights = weights + alpha * error * dataMatrix[dataIndex[randIndex]]   	#更新回归系数
			weights_array = np.append(weights_array,weights,axis=0) 		#添加回归系数到数组中
			del(dataIndex[randIndex]) 										#删除已经使用的样本
	weights_array = weights_array.reshape(numIter*m,n) 						#改变维度
	return weights,weights_array 											#返回


"""
函数说明:绘制回归系数与迭代次数的关系

Parameters:
	weights_array1 - 回归系数数组1
	weights_array2 - 回归系数数组2

"""
def plotWeights(weights_array1,weights_array2):
    fig, axs = plt.subplots(nrows=3, ncols=2,sharex=False, sharey=False, figsize=(20,10))
    x1 = np.arange(0, len(weights_array1), 1)
    # 绘制w0与迭代次数的关系
    axs[0][0].plot(x1,weights_array1[:,0])
    axs0_title_text = axs[0][0].set_title(u'Improved Random Gradient Ascension Algorithm')
    axs0_ylabel_text = axs[0][0].set_ylabel(u'W0')
    plt.setp(axs0_title_text, size=20, weight='bold', color='black')  
    plt.setp(axs0_ylabel_text, size=20, weight='bold', color='black') 
    # 绘制w1与迭代次数的关系
    axs[1][0].plot(x1,weights_array1[:,1])
    axs1_ylabel_text = axs[1][0].set_ylabel(u'W1')
    plt.setp(axs1_ylabel_text, size=20, weight='bold', color='black') 
    # 绘制w2与迭代次数的关系
    axs[2][0].plot(x1,weights_array1[:,2])
    axs2_xlabel_text = axs[2][0].set_xlabel(u'Iterations')
    axs2_ylabel_text = axs[2][0].set_ylabel(u'W2')
    plt.setp(axs2_xlabel_text, size=20, weight='bold', color='black')  
    plt.setp(axs2_ylabel_text, size=20, weight='bold', color='black') 

    x2 = np.arange(0, len(weights_array2), 1)
    # 绘制w0与迭代次数的关系
    axs[0][1].plot(x2,weights_array2[:,0])
    axs0_title_text = axs[0][1].set_title(u'Gradient Ascending Algorithm')
    axs0_ylabel_text = axs[0][1].set_ylabel(u'W0')
    plt.setp(axs0_title_text, size=20, weight='bold', color='black')  
    plt.setp(axs0_ylabel_text, size=20, weight='bold', color='black') 
    # 绘制w1与迭代次数的关系
    axs[1][1].plot(x2,weights_array2[:,1])
    axs1_ylabel_text = axs[1][1].set_ylabel(u'W1')
    plt.setp(axs1_ylabel_text, size=20, weight='bold', color='black') 
    # 绘制w2与迭代次数的关系
    axs[2][1].plot(x2,weights_array2[:,2])
    axs2_xlabel_text = axs[2][1].set_xlabel(u'Iterations')
    axs2_ylabel_text = axs[2][1].set_ylabel(u'W2')
    plt.setp(axs2_xlabel_text, size=20, weight='bold', color='black')  
    plt.setp(axs2_ylabel_text, size=20, weight='bold', color='black') 

    plt.show()

if __name__ == '__main__':
	dataMat, labelMat = loadDataSet()			
	weights1,weights_array1 = stocGradAscent1(np.array(dataMat), labelMat)

	weights2,weights_array2 = gradAscent(dataMat, labelMat)
	plotWeights(weights_array1, weights_array2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/744871.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第8天 | 模型的保存与加载

内容介绍:在训练网络模型的过程中,实际上我们希望保存中间和最后的结果,用于微调(fine-tune)和后续的模型推理与部署,本章节我们将介绍如何保存与加载模型。 具体内容: 1. 导包 import numpy…

1.1 MySQL用户管理

1.1.1 用户的定义 用户名主机域 mysql> select user,host,password from mysql.user; --------------------------------------------------------------- | user | host | password | -----------------------------------------…

el-form重置后input无法输入问题

新增用户遇到的问题: 如果你没有为 formData 设置默认值,而只是将其初始化为空对象 {},则在打开dialog时,正常输入, formdata会变成如下 但是,打开后,直接使用 resetFields 或直接清空表单&…

LLDB 详解

LLDB 详解 LLDB 详解编译器集成优势LLDB 的主要功能命令格式原始(raw)命令选项终止符: -- LLDB 中的变量唯一匹配原则helpexpressionprint、call、po控制流程:continue、next、step、finishregister read / writethread backtracethread retu…

基于weixin小程序新生报到系统的设计

管理员账户功能包括:系统首页,个人中心,学生管理,班级信息管理,师资力量管理,宿舍信息管理,宿舍安排管理,签到信息管理,论坛管理 小程序功能包括:系统首页&am…

考研数学一有多难?130+背后的残酷真相

考研数学一很难 大家平时在网上上看到很多人说自己考了130,其实这些人只占参加考研数学人数的极少部分,有个数据可以展示出来考研数学到底有多难: 在几百万考研大军中,能考到120分以上的考生只有2%。绝大多数人的分数集中在30到…

【MySQL进阶之路 | 高级篇】MySQL8.0索引新特性->降序索引与隐藏索引

1. 支持降序索引 降序索引以降序存储键值.虽然在语法上,从MySQL4版本已经支持降序索引的语法了,但实际上该DESC定义是被忽略的.知道MySQL8.x版本才开始真正支持降序索引.(仅限于InnoDB存储引擎). MySQL在8.0版本前创建的仍然是升序索引,使用…

【C++11(二)】lambda表达式和可变参数模板

一、可变参数模板 C11的新特性可变参数模板 能够让您创建可以接受 可变参数的函数模板和类模板 // Args是一个模板参数包&#xff0c;args是一个函数形参参数包 // 声明一个参数包Args...args&#xff0c;这个参数包中可以包含0到任意个模板参数。 template <class ...Arg…

vue3 使用JsMind的方法,以及引入提示报错,无法找到模块“jsmind”的声明文件

最终结果&#xff1a; 一、使用&#xff1a;使用yarn或者npm 安装 yarn add jsmind npm install vue-jsmind 二、引入 两种方法&#xff1a;&#xff08;如果这样引入没问题按照这样引入&#xff09; import "jsmind/style/jsmind.css"; import JsMind from &quo…

【SSM】医疗健康平台-用户端-体检预约

知识目标 了解FreeMarker&#xff0c;能够简述FreeMarker的作用和生成文件的原理 熟悉FreeMarker的常用指令&#xff0c;能够在FTL标签中正确使用assign指令、include指令、if指令和list指令 掌握显示套餐列表功能的实现 掌握显示套餐详情功能的实现 掌握体检预约功能的实现…

nodejs——ejs模版遇到原型链污染产生rce

[GYCTF2020]Ez_Express 打开是一个登陆框 在源代码中找到 在代码里找到敏感关键字 找到merge 想到原型链污染 这里登陆只能用ADMIN才能登陆成功 但是这里index.php又设置了一个waf ban了admin的大小写 这里需要绕过这个waf 看注册这段代码 用的是这个toUpperCase()函数 之前…

【深度强化学习】如何使用多进程(multiprocessing、pipe)来加速训练

文章目录 实验结果实现思路思路1思路2 进程与线程介绍如何实现multiprocessing、Pipe的范例关于时间对比上的问题代码修改收敛为何不稳定 技巧进程资源抢占问题线程问题cpu和gpu问题 进阶&#xff08;还没看懂/还没实验&#xff09;附代码raw代码mul代码 实验结果 实验平台&am…

natsort 自然排序

1、安装 pip install natsort 2、为什么使用natsort 而不是sorted 在python中只需要调用sorted函数就可以了&#xff0c;但是这个函数有一个缺点&#xff0c;就是它是按照从第一位开始的顺序排列的。意思是&#xff1a; wav_file [1.wav, 13.wav, 9.wav, 2.wav,"23.wav…

Golang | Leetcode Golang题解之第198题打家劫舍

题目&#xff1a; 题解&#xff1a; func rob(nums []int) int {if len(nums) 0 {return 0}if len(nums) 1 {return nums[0]}first : nums[0]second : max(nums[0], nums[1])for i : 2; i < len(nums); i {first, second second, max(first nums[i], second)}return se…

图形编辑器基于Paper.js教程04: Paper.js中的基础知识

背景 了解paper.js的基础知识&#xff0c;在往后的开发过程中会让你如履平地。 基础知识 paper.js 提供了两种编写方式&#xff0c;一种是纯粹的JavaScript编写&#xff0c;还有一种是使用官方提供的PaperScript。 区别就是在于&#xff0c;调用paper下的字对象是否需要加pa…

Linux核心基础详解(第13天)

系列文章目录 一、Linux基础详解&#xff0c; 二、网编三要素和SSH原理 三、shell编程&#xff08;补充&#xff09; 文章目录 系列文章目录前言一、linux简介二、虚拟机简介1、设置VMware网卡1.1 修改VMware中网络1.2 修改本地net8网卡ip 2、安装命令版裸机3、安装centos操作…

Elasticsearch:使用 Llamaindex 的 RAG 与 Elastic 和 Llama3

这篇文章是对之前的文章 “使用 Llama 3 开源和 Elastic 构建 RAG” 的一个补充。我们可以在本地部署 Elasticsearch&#xff0c;并进行展示。我们将一步一步地来进行配置并展示。你还可以参考我之前的另外一篇文章 “Elasticsearch&#xff1a;使用在本地计算机上运行的 LLM 以…

【MySQL】 -- 事务

如果对表中的数据进行CRUD操作时&#xff0c;不加控制&#xff0c;会带来一些问题。 比如下面这种场景&#xff1a; 有一个tickets表&#xff0c;这个数据库被两个客户端机器A和B用时连接对此表进行操作。客户端A检查tickets表中还有一张票的时候&#xff0c;将票出售了&#x…

DOM遍历

DOM 遍历是指在 HTML 文档中导航和定位元素的过程。通过 DOM 遍历&#xff0c;您可以在文档中移动并查找特定的元素&#xff0c;以便对其进行操作或者检索信息。 寻找子元素 //DOM遍历 const h1 document.querySelector(h1);//寻找子元素 console.log(h1.querySelectorAll(.…

华为鸿蒙正式杀入工业自动化,反攻开始了!

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 在近日举行的2024华为开发者大会上&#xff0c;华龙讯达与华为共同发布了基于鸿蒙内核技术的“HualongOS 华龙工业操作系统”&#xff0c;这一里…