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()
结果: