【Python实验设计】KNN分类算法 | K-means聚类算法 | matplotlib龟兔赛跑 | 阻尼衰减曲线 | 雷达图 | sqlite3数据库

一、【使用KNN分类算法实现根据身高和体重对体型分类】

KNN(K-Nearest Neighbors)分类算法是一种基于实例的监督学习算法,用于对未知样本进行分类,其基本思想是通过测量不同特征之间的距离来判断样本的类别。

算法过程:

准备数据集:收集已经标记好类别的样本数据集。

选择K值:确定要考虑的最近邻居的数量K。K可以是任意正整数,通常通过交叉验证或其他方法来确定最佳的K值。

计算距离:对于待分类的样本,计算它与训练集中每个样本之间的距离。通常使用欧氏距离、曼哈顿距离等作为距离度量方式。

选择最近的K个邻居:根据计算得到的距离,选择与待分类样本距离最近的K个样本作为最近邻居。

确定类别:根据K个最近邻居的类别,采取多数表决的方式确定待分类样本的类别。即,选择K个最近邻居中出现次数最多的类别作为待分类样本的类别。

输出结果:将待分类样本归类到确定的类别中。

对于使用KNN算法对身高和体重进行分类,就想到首先需要采集数据,这里我列举了5x10一共50人的身高和体重,每一位的身高体重给他定义了一个标签“偏瘦”“标准”“偏胖”,于是得到了数据集。

然后调用sklearn.neighbors里面的KneighborsClassifier分类器,实例化后训练数据,得到模型后进行测试预测,输入三个测试人的身高和体重,观察其预测结果。

# 使用KNN分类算法实现根据(身高和体重)对体型进行分类

from sklearn.neighbors import KNeighborsClassifier    # 导入KNN分类算法包

My_tall_weight_train = [
    [180, 50], [180, 65], [180, 90], [180, 95], [180, 55],
    [168, 57], [176, 65], [163, 48], [182, 80], [159, 51],
    [175, 90], [165, 50], [185, 100], [160, 45], [180, 95],
    [170, 55], [190, 105], [155, 40], [176, 85], [162, 48],
    [172, 60], [195, 110], [158, 42], [182, 94], [168, 52],
    [178, 80], [150, 35], [188, 98], [157, 43], [173, 68],
    [165, 37], [188, 70], [175, 80], [183, 88], [162, 45],
    [176, 75], [168, 58], [158, 41], [179, 82], [170, 50],
    [187, 97], [152, 38], [169, 62], [181, 92], [172, 56],
    [191, 103], [157, 44], [174, 78], [164, 49], [184, 90]
]

My_tall_weight_biaoqian_train = [
    '偏瘦', '标准', '偏胖', '偏胖', '偏瘦',
    '标准', '标准', '偏瘦', '偏胖', '偏瘦',
    '偏胖', '偏瘦', '偏胖', '偏瘦', '偏胖',
    '标准', '偏胖', '偏瘦', '偏胖', '偏瘦',
    '标准', '偏胖', '偏瘦', '偏胖', '标准',
    '偏胖', '偏瘦', '偏胖', '偏瘦', '标准',
    '偏瘦', '标准', '标准', '偏胖', '偏瘦',
    '标准', '偏瘦', '偏胖', '偏瘦', '标准',
    '偏胖', '偏瘦', '偏胖', '偏瘦', '偏胖',
    '标准', '偏瘦', '偏胖', '偏瘦', '偏胖'
]

# 实例化knn对象
knn = KNeighborsClassifier(n_neighbors=5)
# n_neighbors:就是k-NN的k的值,选取最近的k个点。

knn.fit(My_tall_weight_train, My_tall_weight_biaoqian_train)
# knn.fit(x_train.y_train)使用k-近邻算法对训练数据集x_train和对应的标签y_rain进行拟合。

My_test = [[172, 40], [172, 50], [172, 60]]

My_pre = knn.predict(My_test)
print(My_pre)

二、【使用k-means聚类算法进行分类】

K-means

——物以类聚,人以群分。

沿用第一题的身高体重数据,对身高和体重进行聚类,这里就是需要去了解学习sklearn.cluster 库里面的 Kmeans包,就是专门用来进行k-means聚类算法进行分类。

使用Kmeans算法训练数据集,之后遍历循环得到分类后的不同类的点,将同一类的点赋予相同颜色,最后使用matplotlib.pyplot进行图像可视化。

# k-means聚类算法进行分类  (可以沿用第一题的身高体重数据 | 或者是手写数据集MINIST)

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# plt绘图显示中文名
plt.rcParams['font.sans-serif'] = ['SimHei']

# 定义身高体重数据
My_tall_weight_train = [
    [180, 50], [180, 65], [180, 90], [180, 95], [180, 55],
    [168, 57], [176, 65], [163, 48], [182, 80], [159, 51],
    [175, 90], [165, 50], [185, 100], [160, 45], [180, 95],
    [170, 55], [190, 105], [155, 40], [176, 85], [162, 48],
    [172, 60], [195, 110], [158, 42], [182, 94], [168, 52],
    [178, 80], [150, 35], [188, 98], [157, 43], [173, 68],
    [165, 37], [188, 70], [175, 80], [183, 88], [162, 45],
    [176, 75], [168, 58], [158, 41], [179, 82], [170, 50],
    [187, 97], [152, 38], [169, 62], [181, 92], [172, 56],
    [191, 103], [157, 44], [174, 78], [164, 49], [184, 90]
]

My_kmeans = KMeans(n_clusters=3)
# n_clusters 生成的聚类数

My_kmeans.fit(My_tall_weight_train)    # 训练

cls1 = [My_tall_weight_train[i] for i in range(len(My_kmeans.labels_)) if My_kmeans.labels_[i] == 0]
cls2 = [My_tall_weight_train[i] for i in range(len(My_kmeans.labels_)) if My_kmeans.labels_[i] == 1]
cls3 = [My_tall_weight_train[i] for i in range(len(My_kmeans.labels_)) if My_kmeans.labels_[i] == 2]

plt.scatter([x[0] for x in cls1], [y[1] for y in cls1], color = 'red')
plt.scatter([x[0] for x in cls2], [y[1] for y in cls2], color = 'blue')
plt.scatter([x[0] for x in cls3], [y[1] for y in cls3], color = 'green')

plt.xlabel('身高')
plt.ylabel('体重')
plt.title("使用K-Means进行聚类")
plt.show()

三、【使用matplotlib绘制折线图对龟兔赛跑中兔子和乌龟的行走轨迹进行可视化】

我们大家儿时都喜欢的故事书《伊索寓言》就曾经讲过这样一个故事—龟兔赛跑:比赛开始后,兔子飞快地冲出了起点,远远领先于乌龟,他看到自己的优势,就觉得胜利已经近在眼前。于是,兔子决定在路边的树下休息片刻,等待乌龟迎头赶上时再继续比赛。

而乌龟虽然行动缓慢,但他一直坚持不懈地朝目标前进。他没有停下来休息,而是一步一步地向前移动。当乌龟走到兔子停下的树下时,他看到兔子正在打盹,于是他默默地继续前行。

当兔子醒来时,他发现乌龟已经接近终点了。他慌忙起身,全力冲刺,但已经来不及了。乌龟以他稳定的速度跑到终点,成为了比赛的胜利者。

我们使用Python中的matplotlib库,对这个故事进行形象的表示,那就需要模拟乌龟和兔子各自的行走轨迹,再绘制折线图,设置图表的格式等。

# 使用matplotlib绘制折现图,对龟兔赛跑中兔子和乌龟行走轨迹进行可视化

import matplotlib.pyplot as plt
# plt绘图显示中文名
plt.rcParams['font.sans-serif'] = ['SimHei']

# 乌龟行走轨迹
turtle_path = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
# 兔子行走轨迹
rabbit_path = [0, 2, 4, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 10, 12, 14, 16]

# 绘制折线图
plt.plot(turtle_path, label='乌龟')  # 绘制乌龟行走轨迹
plt.plot(rabbit_path, label='兔子')  # 绘制兔子行走轨迹

# 设置图表标题、坐标轴名称、图例等属性
plt.title('---龟兔赛跑轨迹---')
plt.xlabel('时间(s)')
plt.ylabel('距离(m)')
plt.legend()    # 线例

# 显示图形
plt.show()

四、【科学坐标图绘制:根据给定的数据绘制阻尼衰减曲线图】

所谓阻尼振荡最简单的就是带阻尼的弹簧震荡,这在我们自动化学院的专业核心课程《自动控制原理》就有详细的说明,现在就尝试用Python的numpy库结合matplotlib库进行绘制。

生成等间距离散的点,形成x轴,再用一个表达式表示y轴,就是我们的阻尼震荡曲线,最后使用pyplot绘出即可。

# 科学坐标图绘制:根据给定的数据绘制阻尼衰减曲线图

import numpy as np
import matplotlib.pyplot as plt
pi = np.pi

# 生成离散的点
My_x = np.linspace(0, 10, 100)

# 阻尼震荡曲线
My_y = np.exp( - My_x) * np.cos(2 * pi * My_x)
print(My_y)

plt.plot(My_x, My_y)
plt.show()

五、【多级雷达图绘制:根据给定的任务能力数据,绘制多级雷达图】

雷达图就像一张蜘蛛网,它对于数据的表示以及可视化有很好的表现,但是其绘制过程也相对于比较复杂,并且雷达图运用在两个及两个以上的对比数据中有很直观的展现。

这里我们对两位同学大学里面的五门课程进行雷达图显示,“高等数学”“大学物理”“大学体育”“C语言”“线性代数”,以此用雷达图直观的来进行比较。

# 多级雷达图绘制:根据给定任务能力数据,绘制多级雷达图

import numpy as np
import matplotlib.pyplot as plt
pi = np.pi
# plt绘图显示中文名
plt.rcParams['font.sans-serif'] = ['SimHei']

# 使用字典存储
My_Score = [{'高等数学': 93, '大学物理': 80, '大学体育': 60, 'C语言': 98, '线性代数': 85},
            {'高等数学': 80, '大学物理': 65, '大学体育': 90, 'C语言': 80, '线性代数': 85}]
data_len = len(My_Score[0])    # 五维度
print(data_len)

angles = np.linspace(0, 2 * pi, data_len, endpoint=False)    # 把360度分成5个,不包括最后值

lab = [key for key in My_Score[0].keys()]    # 获取五个维度的标签
print(lab)
My_score_evey = [[v for v in socre.values()] for socre in My_Score]    # 获取各课成绩
print(My_score_evey)

My_score_evey_1 = np.concatenate((My_score_evey[0], [My_score_evey[0][0]]))    # 获取第一个
print(My_score_evey_1)

My_score_evey_2 = np.concatenate((My_score_evey[1], [My_score_evey[1][0]]))    # 获取第二个
print(My_score_evey_2)

angles = np.concatenate((angles, [angles[0]]))
lab = np.concatenate((lab, [lab[0]]))
print(angles)
print(lab)

My_fig = plt.figure(figsize=(8, 6), dpi=100)
ax = plt.subplot(111, polar=True)

ax.plot(angles, My_score_evey_1, color='red')
ax.plot(angles, My_score_evey_2, color='blue')

ax.set_thetagrids(angles * 180 / pi, lab)
ax.set_theta_zero_location('N')

ax.set_rlabel_position(270)

plt.show()

六、【在sqlite3数据库设计】

在“Student.db”中,新建一张名为“userinfo”的表,并插入以下记录后,将王五的Email修改更新为Wangwu@163.com后,将所有的记录打印输出。

SQLite是一种嵌入式关系型数据库管理系统(RDBMS),它被设计成轻量级、快速且易于使用。SQLite不像传统的客户端/服务器数据库系统,它将整个数据库作为一个文件存储在主机文件系统中。SQLite的应用范围广泛,特别适合小规模项目、个人应用和移动应用等场景。它可以与多种编程语言集成,并提供了丰富的API,如C/C++、Python、Java等。无需独立的数据库服务器,SQLite可以直接在应用程序内部进行数据存储和管理,使得数据访问更加高效和便捷。

数据库的基本操作:增删改查,在sqlite3中都能实现。

StuNumber

Name

ClassNumber

Email

20190001

张三

C01

Zhangsan@163.com

20190002

李四

C02

Lisi@163.com

20190003

王五

C03

Wangwu@qq.com

20190004

小明

C04

Xiaoming@qq.com

# 在sqlite3数据库“Student.db”中,新建一张名为“userinfo”的表,并插入以下记录后,
# 将王五的Email修改更新为Wangwu@163.com后,将所有的记录打印输出。
import sqlite3

conn = sqlite3.connect('Student.db')
cur = conn.cursor()

cur.execute("DROP TABLE IF EXISTS userinfo")

sql_text_1 = '''CREATE TABLE userinfo
             (
             StuNumber NUMBER,
             Name TEXT,
             ClassNumber TEXT,
             Email TEXT
             )
             '''
cur.execute(sql_text_1)

sql_text_2 = "INSERT INTO userinfo VALUES (20190001,'张三', 'C01', 'Zhangsan@163.com')"
cur.execute(sql_text_2)

data = [
    (20190002, '李四', 'C02', 'Lisi@163.com'),
    (20190003, '王五', 'C03', 'Wangwu@qq.com'),
    (20190004, '小明', 'C04', 'Xiaoming@qq.com')
]
cur.executemany('INSERT INTO userinfo VALUES(?,?,?,?)', data)
conn.commit()

cur.execute('SELECT * FROM userinfo')
rows = cur.fetchall()
for row in rows:
    print(row)

print('------------------------------------------')
cur.execute("UPDATE userinfo SET Email = 'Wangwu@163.com' WHERE Name = '王五'")
cur.execute('SELECT * FROM userinfo')
rows = cur.fetchall()
for row in rows:
    print(row)

渝北仙桃数据谷

2023.11.6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Akaxi-1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值