網站首頁 編程語言 正文
一、先上手擼代碼!
1、首先是導入所需要的庫和數據
import pandas as pd
import numpy as np
import random
import math
import matplotlib.pyplot as plt
# 這兩行代碼解決 plt 中文顯示的問題
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('13信科學生成績.xlsx')
data = np.array(df)
df.head(10)
先給大伙們看看數據集長啥樣:
用matplotlib簡單的可視化一下初始數據:
# 輸入數據
x = data.T[0]
y = data.T[1]
plt.scatter(x, y, s=50, c='r') # 畫散點圖
plt.xlabel('平時') # 橫坐標軸標題
plt.ylabel('期末') # 縱坐標軸標題
plt.show()
?2、接下來就是kmeans的核心算法了
k=3
i = 1
min1 = data.min(axis = 0)
max1 = data.max(axis = 0)
#在數據最大最小值中隨機生成k個初始聚類中心,保存為t
centre = np.empty((k,2))
for i in range(k):
centre[i][0] = random.randint(min1[0],max1[0])#平時成績
centre[i][1] = random.randint(min1[1],max1[1])#期末成績
while i<500:
#計算歐氏距離
def euclidean_distance(List,t):
return math.sqrt(((List[0] - t[0])**2 + (List[1] - t[1])**2))
#每個點到每個中心點的距離矩陣
dis = np.empty((len(data),k))
for i in range(len(data)):
for j in range(k):
dis[i][j] = euclidean_distance(data[i],centre[j])
#初始化分類矩陣
classify = []
for i in range(k):
classify.append([])
#比較距離并分類
for i in range(len(data)):
List = dis[i].tolist()
index = List.index(dis[i].min())
classify[index].append(i)
#構造新的中心點
new_centre = np.empty((k,2))
for i in range(len(classify)):
new_centre[i][0] = np.sum(data[classify[i]][0])/len(classify[i])
new_centre[i][1] = np.sum(data[classify[i]][1])/len(classify[i])
#比較新的中心點和舊的中心點是否一樣
if (new_centre == centre).all():
break
else:
centre = new_centre
i = i + 1
# print('迭代次數為:',i)
print('聚類中心為:',new_centre)
print('分類情況為:',classify)
注意!!!這里的k是指分成k類,讀者可以自行選取不同的k值做實驗
3、可視化部分(將不用類用不同顏色區分開來~~)
mark = ['or', 'ob', 'og', 'ok','sb', 'db', '<b', 'pb'] #紅、藍、綠、黑四種顏色的圓點
#mark=['sb', 'db', '<b', 'pb']
plt.figure(3)#創建圖表1
for i in range(0,k):
x=[]
y=[]
for j in range(len(classify[i])):
x.append(data[classify[i][j]][0])
y.append(data[classify[i][j]][1])
plt.xlim(xmax=105,xmin=45)
plt.ylim(ymax=85,ymin=-5)
plt.plot(x,y,mark[i])
#plt.show()
?一起來康康可視化結果8!!
二、接下來是調庫代碼!(sklearn)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn import metrics
df = pd.read_excel('13信科學生成績.xlsx')
data = np.array(df)
y_pred=KMeans(n_clusters=3,random_state=9).fit_predict(data)
plt.scatter(data[:,0],data[:,1],c=y_pred)
plt.show()
print(metrics.calinski_harabasz_score(data,y_pred))
?可視化結果和手擼的結果略有差別,有可能是數據集的問題,也有可能是k值選取的問題,各位親們不需要擔心!!!
附:對k-means算法的認識
1.優點
(1)算法快速、簡單。
(2)對大數據集有較高的效率并且是可伸縮性的。
(3)時間復雜度近于線性,而且適合挖掘大規模數據集。K-Means聚類算法的時間復雜度是O(nkt) ,其中n代表數據集中對象的數量,t代表著算法迭代的次數,k代表著簇的數目。
2.缺點
(1)聚類是一種無監督的學習方法,在 K-means 算法中 K 是事先給定的,K均值算法需要用戶指定創建的簇數k,但這個 K 值的選定是非常難以估計的。
(2)在 K-means 算法中,首先需要根據初始聚類中心來確定一個初始劃分,然后對初始劃分進行優化。這個初始聚類中心的選擇對聚類結果有較大的影響,一旦初始值選擇的不好,可能無法得到有效的聚類結果,這也成為 K-means算法的一個主要問題。
(3)從 K-means 算法框架可以看出,該算法需要不斷地進行樣本分類調整,不斷地計算調整后的新的聚類中心,因此當數據量非常大時,算法的時間開銷是非常大的。所以需要對算法的時間復雜度進行分析、改進,提高算法應用范圍,而這導致K均值算法在大數據集上收斂較慢。
總結
原文鏈接:https://blog.csdn.net/weixin_46657323/article/details/122990560
相關推薦
- 2022-03-30 C語言中循環語句練習實例_C 語言
- 2022-10-14 Sklearn中predict_proba函數用法及原理詳解
- 2022-09-14 C語言多媒體框架GStreamer入門和概述_C 語言
- 2022-04-03 深入了解Python如何操作MongoDB_python
- 2023-01-03 python案例中Flask全局配置示例詳解_python
- 2022-07-12 springboot整合jasypt加密yml配置文件
- 2022-07-08 Python如何通過地址獲取變量_python
- 2022-04-25 C#利用NPOI操作Excel(單元格設置)_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支