本文共 3364 字,大约阅读时间需要 11 分钟。
KMains算法的原理:
通过K-Main算法实现对成绩的预测,K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。 假设要把样本集分为k个类别,算法描述如下: (1)适当选择k个类的初始中心,最初一般为随机选取; (2)在每次迭代中,对任意一个样本,分别求其到k个中心的欧式距离,将该样本归到距离最短的中心所在的类; (3)利用均值方法更新该k个类的中心的值; (4)对于所有的k个聚类中心,重复(2)(3),类的中心值的移动距离满足一定条件时,则迭代结束,完成分类。 Kmeans聚类算法原理简单,效果也依赖于k值和类中初始点的选择。import numpy as npfrom sklearn.cluster import KMeansimport pandas as pdimport seaborn as snsimport matplotlib.pyplot as pltfrom pyecharts.charts.map import Mapfrom pyecharts.charts.line import Linedf = 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'] = Falsesns.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, studentGradeclass 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_predictif __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()
结果:
转载地址:http://uulzi.baihongyu.com/