用KMeans算法实现成绩的预测(并对一些数据进行可视化)

KMeans算法的原理:
通过K-Means算法实现对成绩的预测,K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。
假设要把样本集分为k个类别,算法描述如下:
  (1)适当选择k个类的初始中心,最初一般为随机选取;
  (2)在每次迭代中,对任意一个样本,分别求其到k个中心的欧式距离,将该样本归到距离最短的中心所在的类;
  (3)利用均值方法更新该k个类的中心的值;
  (4)对于所有的k个聚类中心,重复(2)(3),类的中心值的移动距离满足一定条件时,则迭代结束,完成分类。
Kmeans聚类算法原理简单,效果也依赖于k值和类中初始点的选择。

import numpy as np
from sklearn.cluster import KMeans
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from pyecharts.charts.map import Map
from pyecharts.charts.line import Line


df = pd.DataFrame(pd.read_excel('成绩.xls'))#放成绩的excel文档,存放两门数据。Linux成绩和云计算成绩,各13个。
print(df)
print(df.describe())

plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
sns.set()
sns.distplot(df.云计算, bins=5, hist=True, kde=False)

plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 散点图
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.scatter(df['Linux'], df['云计算'])
plt.xlabel('Linux')
plt.ylabel('云计算')
plt.title('Linux和云计算成绩散点图')
plt.show()

# 箱形图
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
plt.title('云计算')
ax.boxplot(df['云计算'])
plt.show()

# 家庭地址
city = ['太原市', '大同市', '忻州市', '临汾市', '运城市', '吕梁市']
values = [3, 1, 1, 2, 4, 2]
map = Map("学生家乡", '山西', width=1200, height=600)
map.add('山西', city, values, visual_range=[1, 10], maptype='山西', is_visualmap=True, visual_text_color='#000')
map.render(path="./山西地图.html")


def loadData(filePath):
    fr = open(filePath, 'r+', encoding='utf-8')
    lines = fr.readlines()
    studentName = []
    studentGrade = []
    for line in lines:
        items = line.strip().split(",")
        studentGrade.append(items[0])
        studentName.append([float(items[i]) for i in range(1, len(items))])
    return studentName, studentGrade


class SingleLinearRegression:  #最小二乘法,散点图,计算回归曲线
    def __init__(self):
        self.a_ = None;
        self.b_ = None;

    def fit(self, x_train, y_train):
        x_mean = np.mean(x_train)
        y_mean = np.mean(y_train)

        fenzi = 0.0;
        fenmu = 0.0;
        for x_i, y_i in zip(x_train, y_train):
            fenzi += (x_i - x_mean) * (y_i - y_mean)
            fenmu += (x_i - x_mean) ** 2

        self.a = fenzi / fenmu
        self.b = y_mean - self.a * x_mean

        return self

    def predict(self, x_test_group):
        result = []
        for x_test in x_test_group:  # 对于每个输入的x都计算它对应的预测y值并加入列表中
            result.append(self.a * x_test + self.b)
        y_predict = np.array(result)  # 将列表转换为矩阵向量形式方便运算

        return y_predict


if __name__ == '__main__':
    name, studentGrade = loadData('D:\\Pycharm\\homework\\成绩.txt')
    km = KMeans(n_clusters=4)
    label = km.fit_predict(name)
    avegrade = np.sum(km.cluster_centers_, axis=1)
    StudentCluster = [[], [], [], []]
    for i in range(len(studentGrade)):
        StudentCluster[label[i]].append(studentGrade[i])
    for i in range(len(StudentCluster)):
        print("avegrade:%.2f" % avegrade[i])
        print(StudentCluster[i])

    x = np.array([88, 86, 87, 84, 77, 76, 85, 88, 84, 80, 85, 75, 68])
    y = np.array([83, 92, 76, 90, 81, 78, 76, 80, 63, 75, 70, 68, 47])
    l = SingleLinearRegression()
    l.fit(x, y)
    print('Linux分数为90的预测云计算成绩为:')
    print(l.predict([90]))

    # 画出散点图和预测图
    plt.scatter(x, y, color='b')
    plt.plot(x, l.predict(x), color='r')  # 画出预测后的线
    plt.xlabel('Linux')
    plt.ylabel('云计算')
    plt.show()


结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

K-Means算法是一种常见的聚类算法,它可以将数据集划分为K个不同的簇。MNIST数据集是一个手写数字图像集合,包含60000张训练图像和10000张测试图像。 以下是使用K-Means算法对MNIST数据集聚类的步骤: 1. 加载MNIST数据集,并预处理数据 2. 初始化K个聚类中心 3. 计算每个数据点到聚类中心的距离,并将其分配到最近的聚类中心 4. 更新聚类中心的位置,使其成为所分配数据点的平均值 5. 重复步骤3和4直到聚类中心不再变化或达到最大迭代次数 6. 可视化聚类结果,观察聚类效果 以下是代码实现: ```python from sklearn.cluster import KMeans from sklearn import datasets import matplotlib.pyplot as plt import numpy as np # 加载数据集 digits = datasets.load_digits() X = digits.data y = digits.target # 初始化K值 k = 10 # 使用K-Means算法进行聚类 kmeans = KMeans(n_clusters=k, random_state=0).fit(X) # 获取聚类结果 labels = kmeans.labels_ # 计算准确率 accuracy = np.sum(labels == y) / float(len(y)) # 可视化聚类结果 fig = plt.figure(figsize=(8, 3)) fig.suptitle('Cluster Center Images', fontsize=14, fontweight='bold') for i in range(k): ax = fig.add_subplot(2, 5, 1 + i) ax.imshow(kmeans.cluster_centers_[i].reshape((8, 8)), cmap=plt.cm.binary) plt.show() print("Accuracy: {0:.1f}%".format(accuracy * 100)) ``` 上述代码中,我们使用了sklearn库中的KMeans算法对MNIST数据进行聚类。聚类的结果可以通过labels获取,准确率可以通过计算聚类结果与真实标签的匹配程度得到。最后,我们使用matplotlib库可视化了聚类中心的图像。 执行上述代码后,我们可以得到聚类效果如下图所示: ![cluster_result](https://img-blog.csdn.net/20180830125118380?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BhY2tldGJsb2c=) 从图中可以看出,不同的簇中心对应不同的数字,说明聚类效果较好。代码的输出结果为:Accuracy: 79.9%。这个准确率并不是很高,这是因为MNIST数据集中存在一些难以区分的数字,例如0和6,1和7等。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

如鸿毛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值