天天看点

Julia 机器学习----Kmeans对购房者偏好分析k-means算法原理k-means算法流程k-means优点与缺点k-means的经典案例与适用范围 代码样例

k-means算法原理

K-means中心思想:事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类中,接着,重新计算每个类的质心(即为类中心),重复这样的过程,直到质心不再改变,最终就确定了每个样本所属的类别以及每个类的质心。由于每次都要计算所有的样本与每一个质心之间的相似度,故在大规模的数据集上,K-Means算法的收敛速度比较慢。

聚类算法:是一种典型的无监督学习算法,主要用于将相似的样本自动归到一个类别中。

聚类算法与分类算法最大的区别是:聚类算法是无监督的学习算法,而分类算法属于监督的学习算法,分类是知道结果的。

在聚类算法中根据样本之间的相似性,将样本划分到不同的类别中,对于不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧式距离法。

k-means算法流程

1.选择聚类的个数k(kmeans算法传递超参数的时候,只需设置最大的K值)

2.任意产生k个聚类,然后确定聚类中心,或者直接生成k个中心。

3.对每个点确定其聚类中心点。

4.再计算其聚类新中心。

5.重复以上步骤直到满足收敛要求。(通常就是确定的中心点不再改变。)

k-means优点与缺点

优点:

1、原理简单(靠近中心点) ,实现容易

2、聚类效果中上(依赖K的选择)

3、空间复杂度o(N)时间复杂度o(IKN,N为样本点个数,K为中心点个数,I为迭代次数)

缺点:

1、对离群点, 噪声敏感 (中心点易偏移)

2、很难发现大小差别很大的簇及进行增量计算

3、结果不一定是全局最优,只能保证局部最优(与K的个数及初值选取有关)

k-means的经典案例与适用范围

1.文档分类器:根据标签、主题和文档内容将文档分为多个不同的类别。这是一个非常标准且经典的K-means算法分类问题。

2.物品传输优化:使用K-means算法的组合找到无人机最佳发射位置和遗传算法来解决旅行商的行车路线问题,优化无人机物品传输过程。

3.识别犯罪地点:使用城市中特定地区的相关犯罪数据,分析犯罪类别、犯罪地点以及两者之间的关联,可以对城市或区域中容易犯罪的地区做高质量的勘察。

4.客户分类聚类能过帮助营销人员改善他们的客户群(在其目标区域内工作),并根据客户的购买历史、兴趣或活动监控来对客户类别做进一步细分。

5.球队状态分析:分析球员的状态一直都是体育界的一个关键要素。随着竞争越来愈激烈,机器学习在这个领域也扮演着至关重要的角色。如果你想创建一个优秀的队伍并且喜欢根据球员状态来识别类似的球员,那么K-means算法是一个很好的选择。

6.保险欺诈检测:利用以往欺诈性索赔的历史数据,根据它和欺诈性模式聚类的相似性来识别新的索赔。由于保险欺诈可能会对公司造成数百万美元的损失,因此欺诈检测对公司来说至关重要。

7.乘车数据分析:面向大众公开的Uber乘车信息的数据集,为我们提供了大量关于交通、运输时间、高峰乘车地点等有价值的数据集。分析这些数据不仅对Uber大有好处,而且有助于我们对城市的交通模式进行深入的了解,来帮助我们做城市未来规划。

8.网络分析犯罪分子:网络分析是从个人和团体中收集数据来识别二者之间的重要关系的过程。网络分析源自于犯罪档案,该档案提供了调查部门的信息,以对犯罪现场的罪犯进行分类。

9.呼叫记录详细分析:通话详细记录(CDR)是电信公司在对用户的通话、短信和网络活动信息的收集。将通话详细记录与客户个人资料结合在一起,这能够帮助电信公司对客户需求做更多的预测。

10.IT警报的自动化聚类:大型企业IT基础架构技术组件(如网络,存储或数据库)会生成大量的警报消息。由于警报消息可以指向具体的操作,因此必须对警报信息进行手动筛选,确保后续过程的优先级。对数据进行聚类可以对警报类别和平均修复时间做深入了解,有助于对未来故障进行预测。

以上内容参考:Kmeans算法简书

代码样例

注意:这里没有把数据标准化,没有降维处理,也没有使用协方差选取有效的特征,仅仅是从简单的图表分析来说明问题

选择不同的特征向量进行聚类分析。

下面是根据:平方英尺(:sq__ft)和价格(:price) 两个特征 聚类分析。

using DataFrames,CSV,Statistics
using Plots
using Clustering
import DataFrames:readtable
import Statistics:mean

#download("http://samplecsvs.s3.amazonaws.com/Sacramentorealestatetransactions.csv","houses.csv")

houses = CSV.read("houses.csv")
# houses = DataFrame(CSV.File(joinpath(dirname(pathof(DataFrames)),"D:/leaning/Julia/julia/jbl/houses.csv")));

houses = houses[houses[!,:sq__ft].>0,:]

#轉換成 Float64s類型的數組
fh = select!(houses, [:beds,:baths,:sq__ft,:price,:latitude,:longitude])

# 过滤 所有missing字段,过滤掉sq__ft=0的数据
gd = groupby(fh, [:beds,:baths,:sq__ft,:price,:latitude,:longitude],sort= false,skipmissing=true)
fh = DataFrame(gd)

#现在我们使用transpose()函数对X进行转置。由于kmeans()函数以每一行为特征,每一列为数据点,因此需要转置。
# X = transpose(X)

#这个地方是个坑,如果不适用disallowmissing()函数,features 就会变成Array{Union{Missing, Float64},1}而无法应用到kmean
fh = disallowmissing(fh)

# 这里必须用collect函数,它可以将矩阵中的所有数据转成指定的类型
#convert 也可以转为指定的类型,但是集合类型里面的数据还是保持原来的类型。
# 对于DataFrame 最好提前使用 mapcols(x -> x*1.0, fh) 把所有数据变成浮点数
features = collect(Float64,Matrix(fh[:, 1:6])'); # features to use for clustering
# features = convert(Array, fh)
typeof(features)

result = kmeans(features, 6)

#:beds,:baths,:sq__ft,:price,:latitude,:longitude
scatter([fh.sq__ft], [fh.price], marker_z=result.assignments,
                color=:lightrainbow, legend=false)
           

1:根据平方英尺(sq__ft)与价格(:price)绘制图表,聚簇非常明显,说明房屋面积与价格对购房者偏好很大

Julia 机器学习----Kmeans对购房者偏好分析k-means算法原理k-means算法流程k-means优点与缺点k-means的经典案例与适用范围 代码样例

2:根据户型,卧室(beds),浴室( baths) 信息来绘制图表,虽然是散点图,但是还是能明确区分出聚簇的。说明这两个因素对购房者偏好也比较大

Julia 机器学习----Kmeans对购房者偏好分析k-means算法原理k-means算法流程k-means优点与缺点k-means的经典案例与适用范围 代码样例

3:根据经度(longitude)和纬度(latitude)来绘制图表,明显无法区分聚簇,也就是说购房者偏好与地理位置关系不大。

Julia 机器学习----Kmeans对购房者偏好分析k-means算法原理k-means算法流程k-means优点与缺点k-means的经典案例与适用范围 代码样例

继续阅读