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

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,并去掉空格stripdataMat.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')												#绘制titleplt.xlabel('X1'); plt.ylabel('X2')									#绘制labelplt.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 + 4x_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_newx_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, labelMatdataArr = 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)											#添加subplotax.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')												#绘制titleplt.xlabel('X1'); plt.ylabel('X2')									#绘制labelplt.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的matlabelMat = 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 - hweights = weights + alpha * dataMatrix.transpose() * errorweights_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))		#选择随机选取的一个样本,计算herror = 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 - 回归系数数组1weights_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.mzph.cn/bicheng/35183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app uni-data-picker级联选择器无法使用和清除选中的值

出现问题&#xff1a; 使用点击右边的叉号按钮无法清除已经选择的uni-data-picker值 解决办法&#xff1a; 在uni-app uni-data-picker使用中&#xff0c;要添加v-model&#xff0c;v-model在官网的示例中没有体现&#xff0c;但若不加则无法清除。 <uni-data-picker v-m…

OpenAI用GPT-4o打造癌症筛查AI助手;手机就能检测中风,准确率达 82%!中国气象局发布AI气象大模型...

AI for Science 企业动态速览—— * 皇家墨尔本大学用 AI 检测患者中风&#xff0c;准确率达 82% * OpenAI 用 GPT-4o 模型打造癌症筛查 AI 助手 * 中国气象局发布 AI 气象大模型风清、风雷、风顺 * AI 药企英矽智能&#xff1a;小分子抑制剂已完成中国 IIa 期临床试验全部患者…

GPT-5智能新纪元的曙光

在美国达特茅斯工程学院周四公布的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布&#xff0c;给出了肯定答案并表示将在一年半后发布。穆拉蒂在采访中还把GPT-4到GPT-5的飞跃描述为高中生到博士生的成长。 这一爆炸性的消息&#xff0c;震动了整体…

linux下进度条的实现

目录 一、代码一版 1.processbar.h 2.processbar.c 3.main.c 二、代码二版 1.processbar.h 2.processbar.c 3.main.c 三、改变文字颜色 一、代码一版 使用模块化编程 1.processbar.h #include<stdio.h> #define capacity 101 //常量使用宏定义 #define style…

代码随想录——买股票的最佳时机Ⅱ(Leecode122)

添加链接描述 贪心 局部最优&#xff1a;手机每天的正利润 全局最优&#xff1a;求最大利润 class Solution {public int maxProfit(int[] prices) {int res 0;for(int i 1; i < prices.length; i){res Math.max(prices[i] - prices[i - 1], 0);}return res;} }

webstorm无法识别tsconfig.json引用项目配置文件中的路径别名

问题 vite项目模板中&#xff0c;应用的ts配置内容写在tsconfig.app.json文件中&#xff0c;并在tsconfig.json通过项目引用的方式导入 {"files": [],"references": [{"path": "./tsconfig.app.json"},{"path": "./t…

2024年第十五届蓝桥杯青少组大赛8月24日开启

据蓝桥杯青少组官网显示&#xff0c;2024年第十五届蓝桥杯青少组大赛8月24日开启。 蓝桥杯青少组历届题库地址&#xff1a;http://www.6547.cn/question/cat/2 蓝桥杯青少组历届真题下载&#xff1a;http://www.6547.cn/wenku/list/10

统一视频接入平台LntonCVS视频共享交换平台智慧景区运用方案

随着夏季的到来&#xff0c;各地景区迎来了大量游客&#xff0c;而景区管理面临的挑战也愈加严峻&#xff0c;尤其是安全问题显得格外突出。 视频监控在预防各类安全事故方面发挥着重要作用&#xff0c;不论是自然景区还是人文景区&#xff0c;都潜藏着诸多安全隐患&#xff0…

排序之插入排序----直接插入排序和希尔排序(1)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 排序之插入排序----直接插入排序和希尔排序(1) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记&#xff0c;欢迎大家在评论区交流讨…

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

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

Windows server 由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开。

问题现象&#xff1a; 解决办法 临时远程方式1: 打开 mstsc 时带上 /admin 等参数&#xff0c;如下图所示&#xff1a; 使用“mstsc /admin /v:目标ip”来强制登录服务器&#xff0c;但只能是管理员身份。 远程方式2&#xff1a; 通过VM远程登陆系统后&#xff0c;运行输入R…

Python编程编辑器PyCharm 界面介绍

PyCharm 界面介绍 当你打开 PyCharm 后&#xff0c;会看到以下主要界面区域&#xff1a; 1&#xff09;菜单栏&#xff1a; 位于界面最顶端&#xff0c;包含文件&#xff08;File&#xff09;、编辑&#xff08;Edit&#xff09;、查看&#xff08;View&#xff09;、导航&a…

ICMAN液位检测——WS003B管道检测模组

ICMAN液位检测之WS003B管道检测模组 体积小&#xff0c;成本低&#xff0c; 液位检测精度高&#xff0c; 有水输出低电平无水高电平&#xff0c; 适用于饮水机、咖啡机、扫地机器人、洗地机等&#xff0c; 有需要朋友快联系我吧&#xff01; AWE展会不容错过的ICMAN检测模组…

RabbitMQ实践——搭建多人聊天服务

大纲 用户登录创建聊天室监听Stream&#xff08;聊天室&#xff09;发送消息实验登录Tom侧Jerry侧 创建聊天室Jerry侧Tom侧 进入聊天室Jerry侧Tom侧 发送消息Jerry发送消息Jerry侧聊天室Tom侧聊天室 Tom发送消息Jerry侧聊天室Tom侧聊天室 代码工程参考资料 在《RabbitMQ实践——…

Webpack: 前端资深构建工具

概述 如果你是一名前端工程师&#xff0c;相信之前或多或少听过、用过 Webpack 这一构建工具&#xff0c;它能够融合多种工程化工具&#xff0c;将开发阶段的应用代码编译、打包成适合网络分发、客户端运行的应用产物如今&#xff0c;Webpack 已经深深渗入到前端工程的方方面面…

简单了解IoC

IoC 什么是IoC&#xff1f; IoC&#xff08;Inversion of Control&#xff09;&#xff0c;即控制反转&#xff0c;这是一种设计思想&#xff0c;在Spring指将对象的控制权交给Spring容器&#xff0c;由容器来实现对象的创建、管理&#xff0c;程序员只需要从容器获取想要的对…

java设计模式(四)原型模式(Prototype Pattern)

1、模式介绍&#xff1a; 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许对象在创建新实例时通过复制现有实例而不是通过实例化新对象来完成。这样做可以避免耗费大量的资源和时间来初始化对象。原型模式涉及一个被复制的原型对象…

ES6模板字符串详解

ES6是JavaScript语言的一次重大更新&#xff0c;引入了许多新特性和语法改进&#xff0c;其中模板字符串是一个非常实用和灵活的语法特性。它可以让我们从数组或对象中提取值&#xff0c;并赋给对应的变量&#xff0c;让代码变得更加简洁和易读。 本文将深入探讨ES6解构赋值的语…

Nginx开发--动静分离和URLRewrite

05 【动静分离和URLRewrite】 1.动静分离介绍 为了提高网站的响应速度&#xff0c;减轻程序服务器&#xff08;Tomcat&#xff0c;Jboss等&#xff09;的负载&#xff0c;对于静态资源&#xff0c;如图片、js、css等文件&#xff0c;可以在反向代理服务器中进行缓存&#xff…

减少液氮罐内液氮损耗的方法

监测与管理液氮容器的密封性能 液氮容器的密封性能直接影响液氮的损耗情况。一个常见的损耗源是容器本身的密封不良或老化导致的泄漏。为了有效减少液氮损耗&#xff0c;首先应当定期检查液氮容器的密封性能。这可以通过简单的方法如肉眼检查外观&#xff0c;或者更精确的方法…