思路參考了
資料集放在這裡。
# -*- coding: utf-8 -*-
"""created on mon oct 8 14:42:27 2018
《機器學習》課後9.4 k-means演算法實現
@author: lichen
"""import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import random
filepath=open('s:/機器學習-周志華/西瓜資料集4.0.csv')
data = pd.read_csv(filepath, sep = ',')[["密度","含糖率"]].values.tolist() #tolist:ndarray轉換為list
k=4 #k值設定,2,3,4
mean_vectors = random.sample(data,k) #初始化均值向量,隨機k個
x0= list(map(lambda arr:arr[0],mean_vectors))
y0=list(map(lambda arr:arr[1],mean_vectors))
#將初試的均值向量用紅色的方塊表示出
plt.scatter(x0,y0,c = 'r',marker=',')
#計算歐式距離
def distance(p1,p2):
sum=0
for i,j in zip(p1,p2):
sum=sum+(i-j)**2
return np.sqrt(sum)
time=0 #迴圈次數
clusters= #聚類初始化
while time<100: #迴圈次數限制
clusters = list(map ((lambda x:[x]), mean_vectors) )
change=1
for sample in data:
dist=
for j in mean_vectors:
new_mean_vectors =
for c,v in zip(clusters,mean_vectors):
c_num=len(c)
c_array=np.array(c)
v_array=np.array(v)
new_mean_vector = sum(c_array)/c_num
if all(np.true_divide((new_mean_vector-v_array),v_array) < np.array([0.0001,0.0001]) ):
change=0
else:
if change==1 :
mean_vectors = new_mean_vectors
else :
break
time=time+1
#show the clustering result
x1= list(map(lambda arr:arr[0],clusters[0]))
y1=list(map(lambda arr:arr[1],clusters[0]))
x2= list(map(lambda arr:arr[0],clusters[1]))
y2=list(map(lambda arr:arr[1],clusters[1]))
x3= list(map(lambda arr:arr[0],clusters[2]))
y3=list(map(lambda arr:arr[1],clusters[2]))
x4= list(map(lambda arr:arr[0],clusters[3]))
y4=list(map(lambda arr:arr[1],clusters[3]))
plt.scatter(x1,y1,c = 'y',marker='x', label='class1')
plt.scatter(x2,y2,c = 'g',marker='^', label='class2')
plt.scatter(x3,y3,c = 'blue',marker='*', label='class3')
plt.scatter(x4,y4,c = 'black',marker='+', label='class4')
plt.xlabel('density')
plt.ylabel('sugar_content')
plt.show()
結果因均值向量的初始值不同而不同,如下所示:(k=4)
紅色的方塊的是初始化的均值向量,我們可以看出:初始中心越分散,結果越好。
Java課後作業
問題 某機構2006年培養學員8萬人,每年增長25 請問按此增長速度,到哪一年培訓學員人數將達到20萬人?一 1.用while迴圈語句 public class w system.out.println 到 c 年人數達到20萬 輸出結果 2.用do.while迴圈語句 某機構2006年培養學員8萬...
課後作業4
班級 軟體四班 學號 2016035107136 姓名 劉聰 開發的軟體 飛機大戰 團隊職務 軟體工程師 負責工作 飛機大戰遊戲設計及其 編寫,優化遊戲體驗,完善修復程式的bug。其他的回答在最下方 上述為 倉庫的提交記錄,從2018 11 02到2018 12 25差不多每天都在編寫 向 倉庫提交...
課後作業2
學號 2017035107134 姓名 劉佔鋒 我的碼雲貪吃蛇專案倉庫 psp我的估計 實際情況 計畫10分鐘 10分分鐘 計畫文件 10分鐘 10分鐘 分析10分鐘 5分鐘開始編寫 50分鐘 60分鐘 執行修改 10分鐘 15分鐘 記錄5分鐘 8分鐘總結 10分分鐘 12分鐘 換顏色 多方面換顏色...