密度聚类算法通常需要多种形状的数据集进行测试,提供一种笑脸数据的实现方法。
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
def smileface(std):
radius = 0.55
theta = np.linspace(np.pi*5/4, np.pi*7/4, 100)
Mouth = np.zeros((len(theta), 2))
Mouth[:, 0] = radius * np.cos(theta)
Mouth[:, 1] = radius * np.sin(theta)
noise = np.random.normal(0, std, (len(theta), 2))
Mouth = Mouth + noise
Face, face1 = datasets.make_circles(n_samples=200, factor=0.99, noise=std)
EyeL, eyel = datasets.make_blobs(n_samples=50, n_features=2, centers=[[-0.375, 0.3]], cluster_std=[[std*2]], random_state=9)
EyeR, eyeR = datasets.make_blobs(n_samples=50, n_features=2, centers=[[0.375, 0.3]], cluster_std=[[std*2]], random_state=9)
X = np.concatenate((Face, Mouth, EyeL, EyeR))
return X
if __name__ == "__main__":
Smileface1 = smileface(0.01)
Smileface2 = smileface(0.1)
plt.subplot(1, 2, 1)
plt.scatter(Smileface1[:, 0], Smileface1[:, 1])
plt.title('std = 0.01')
plt.subplot(1, 2, 2)
plt.scatter(Smileface2[:, 0], Smileface2[:, 1])
plt.title('std = 0.1')
plt.suptitle('SMILE FACE')
plt.show()
脸部轮廓由datasets.make.make_circles()函数生成圆形。
双眼由datasets.make_blobs()生成两个点状散点。
datasets中无直接实现半弧形数据的函数,因此通过设计一个圆形数据,取其到的部分,再使用random函数生成噪声。
最后通过np.concatenate()函数将上述数据合并为一个数据集。
smileface()参数std为数据噪声的标准差,std越大,数据离散程度越大,std越小,数据越集中,建议在0.01至0.1范围内取值。
下图为std分别为0.01和0.1时生成的数据集。